安装调试好PHP+Mysql环境后下载了Discuz! 5.0.0简体中文版,在后台添加了一新版块并在其修改页中看到了干扰码的设置项,开启该功能,退出后台随便发表了一篇贴子后退出登录(管理员看不到干扰码),再看贴子时终于见到了久违的干扰码^_^
经过一番追踪,最终将目标锁定于archiver/include/thread.inc.php,关键是里边的一个自定义函数jammer(),代码如下:
<?php
function jammer() {
$randomstr = '';
for($i = 0; $i < mt_rand(5, 15); $i++) {
$randomstr .= chr(mt_rand(0, 59)).chr(mt_rand(63, 126));
}
return mt_rand(0, 1) ? '<font style="font-size:0px;color:'.ALTBG2.'">'.$randomstr.'</font><br />' :
'<br /><span style="display:none">'.$randomstr.'</span>';
}
?>调用该函数将结果输出到页面:
<?php
function jammer() {
$randomstr = '';
for($i = 0; $i < mt_rand(5, 15); $i++) {
$randomstr .= chr(mt_rand(0, 59)).chr(mt_rand(63, 126));
}
return mt_rand(0, 1) ? '<font style="font-size:0px;color:'.ALTBG2.'">'.$randomstr.'</font><br />' :
'<br /><span style="display:none">'.$randomstr.'</span>';
}
echo jammer();
?>就是它了。
其实原理并不是很复杂:将一些随机生成的ASCII值转换成字符并组成字符串,再将这些字符串插入贴子之中就可以了。知道了这个原理我们就可以在HTML、ASP等页面中利用它,下边自定义了一个VBScript干扰码产生函数:
<script language="VBScript">
function getcode(icolor)
Dim iLen,i
randomize
iLen = int(31*rnd+20) '设置干扰码长度,范围[20,50]
for i = 1 to iLen
randomize
getcode = getcode & chr(int(127*rnd+1))
next
getcode = replace(getcode,"<","")
getcode = replace(getcode,">","")
getcode = "<span style=""font-size:0px;color:bgcolor"">" & getcode & "</span>" '只能置于段尾
'getcode = "<span style=""display:none"">" & getcode & "</span>" '可置于任意位置
end function
</script>干扰码应放在什么地方呢?有两种做法。常见的是放在每个段落后面,将"<br/>"替换成"干扰码+<br/>",这也是为什么要用style="font-size:0px;color:bgcolor";另一种方法是随机的在文章中放置,此时必须用style="display:none"。
示例一:
<script language="vbscript">
'*******************************************
'产生干扰码函数
'*******************************************
function mzcode()
Dim iLen,i
randomize
iLen = int(31*rnd+20) '设置干扰码长度,范围[20,50]
for i = 1 to iLen
randomize
mzcode = mzcode & chr(int(127*rnd+1))
next
mzcode = replace(mzcode,"<","")
mzcode = replace(mzcode,">","")
mzcode = "<span style=""display:none"">" & mzcode & "</span>"
end function
'*******************************************
'寻找<brbr/>个数
'*******************************************
function mzbr(temp)
Dim i
i = 1
mzbr = 0
do while i <> 0
i = instr(i,temp,"<brbr/>",1)
if i <> 0 then
mzbr = mzbr + 1
i = i + 1
end if
loop
end function
Dim str,i
str = "我是中国<brbr/>人aaaa我是中<brbr/>国人aaa我是中国人<brbr/>aa"
For i = 1 to mzbr(str)
str = replace(str,"<brbr/>",mzcode,1,1,1)
Next
Document.write str
</script>示例二:
<script language="vbscript">
'*******************************************
'产生干扰码函数
'*******************************************
function mzcode()
Dim iLen,i
randomize
iLen = int(31*rnd+20) '设置干扰码长度,范围[20,50]
for i = 1 to iLen
randomize
mzcode = mzcode & chr(int(127*rnd+1))
next
mzcode = replace(mzcode,"<","")
mzcode = replace(mzcode,">","")
mzcode = "<span style=""display:none"">" & mzcode & "</span>"
end function
'*******************************************
'插入干扰码
'*******************************************
Const iMzcode = 20 '设置干扰字符串个数
function mzcode2(content)
Dim t_c,iLen,i,j,contentL,contentR
t_c = content
For i = 1 to iMzcode
iLen = Len(t_c)
randomize
j = int(iLen*rnd+1)
if asc(mid(t_c,j,1))<0 then
contentL = left(t_c,j)
contentR = right(t_c,iLen - j)
t_c = contentL & "↓" & contentR
end if
Next
For i = 1 to iMzcode
t_c = replace(t_c,"↓",mzcode,1,1,1)
Next
mzcode2 = t_c
end function
Dim str
str = "我是中国人aaaa我是中国人aaa我是中国人aa"
document.write mzcode2(str)
</script>后记:仔细看上边几个函数产生的干扰码,它们的位置是有规律的:为了不影响阅读就必须将干扰码置于font或span标签中。这样有规律很容易就能用正则表达式将其替换,干扰效果也随之打了个折扣。
附:干扰码转贴助手
<html>
<head>
<title>干扰码转贴助手</title>
<style type="text/css">
<!--
.STYLE1 {color: #FF0000}
.STYLE2 {font-size: 12px}
.STYLE4 {font-size: 14; }
-->
</style>
<SCRIPT language=JavaScript>
<!--
function SymError()
{
return true;
}
window.onerror = SymError;
//-->
</SCRIPT>
<SCRIPT language=JavaScript1.2>
function delnull()
{
var str=document.getElementById('text').value;
str=str.replace(/([\s]*\r\n[\s]*){2,}/gm,"\r\n");
document.getElementById('text').value=str;
}
function refix()
{
var str=document.getElementById('text').value;
str=str.replace(/([\s]*\r\n[\s]*){2,}/gm,"\r\n\r\n");
document.getElementById('text').value=str;
}
function url()
{
var str=document.getElementById('text').value;
str=str.replace(/^[ ]*(http:\/\/|^mms:\/\/|rtsp:\/\/|pnm:\/\/|ftp:\/\/|mmst:\/\/|mmsu:\/\/)([^\r\n]*)
$/igm,"[url]$1$2[/url]");
document.getElementById('text').value=str;
}
function addbr()
{
var str=document.getElementById('text').value;
str=str.replace(/\r\n/gm,"\r\n\r\n");
document.getElementById('text').value=str;
}
function html_trans(str) {
str = str.replace(/\r/g,"");
str = str.replace(/on(load|click|dbclick|mouseover|mousedown|mouseup)="[^"]+"/ig,"");
str = str.replace(/<script[^>]*?>([\w\W]*?)<\/script>/ig,"");
if(set.fontbash.checked)
{
str = str.replace(/<span[^>]*?display\s*?:\s*?none[^>]*?>([\w\W]*?)<\/span>/ig,"");
str = str.replace(/<span[^>]*?font\s*?-\s*?size\s*?:\s*(0px|0pt)[^>]*?>([\w\W]*?)<\/span>/ig,"");
str = str.replace(/<font([^>]+)(0px|0pt)+([^>]*)>([\w\W]*?)<\/font>/ig,"");
}
if(set.filtrate.checked)
{
str = str.replace(/[^<]*<([^>]*?)>[^<]*/ig,"<$1>");
tm=window.textfield.value;
if(tm.length<1){
var arr;
arr=str.match(/<img[^>]+src=[" ]?([^"]+)[" ]?[^>]*>/ig);
tm=arr[0].replace(/<img[^>]+src=[" ]?([^"]+)[" ]?[^>]*>/ig,"$1")+"\"";
i=tm.search(/\/[^\/]+"/ig);
tm=tm.substr(0,i);
window.textfield.value=tm+"/";
}
if(tm.substr(tm.length-1,1)!="/") tm+="/";
var strtm="<img[^>]+src=[\"]?("+tm+"[^\"]+)[\"]?[^>]*>";
var re = new RegExp(strtm,"ig");
str = str.replace(re,"\n[img]$1[/img]\n");
}
else
{
if(set.stext.checked) str = str.replace(/[^<]*<([^>]*?)>[^<]*/ig,"<$1>");
if(!set.linka.checked) str = str.replace(/<a[^>]+href=[" ]?([^"]+)[" ]?[^>]*>(.*?)<\/a>/ig,"[url=$1]$2
[/url]");
if(!set.font_color.checked&&!set.stext.checked)
str = str.replace(/<font([^>]+)color=([^ >]+)([^>]*)>(.*?)<\/font>/ig,"[color=$2]<font$1$3>$4</font>
[/color]");
if(!set.font_size.checked&&!set.stext.checked)
str = str.replace(/<font([^>]+)size=([^ >]+)([^>]*)>(.*?)<\/font>/ig,"[size=$2]<font$1$3>$4</font>
[/size]");
if(!set.font_face.checked&&!set.stext.checked)
str = str.replace(/<font[^>]+face=([^ >]+)[^>]*>(.*?)<\/font>/ig,"[font=$1]$2[/font]");
if(!set.img.checked) str = str.replace(/<img[^>]+src=[" ]?([^"]+)[" ]?[^>]*>/ig,"\n[img]$1[/img]\n");
if(!set.odj.checked){
//return str;
str = str.replace(/<object[^>]*?6BF52A52\-394A\-11d3\-B153\-00C04F79FAA6[^>]*?>.*<param[^>]
+name\s*=\s*["](url|src)["][^>]+value=[" ]?([^"]+)[" ][^>]*>.*<\/object>/ig,"\n[wmv]$2[/wmv]\n");
str = str.replace(/<object[^>]*?D27CDB6E\-AE6D\-11cf\-96B8\-444553540000[^>]*?>.*<param[^>]
+name\s*=\s*["](url|src)["][^>]+value=[" ]?([^"]+)[" ][^>]*>.*<\/object>/ig,"\n[swf]$2[/swf]\n");
str = str.replace(/<embed[^>]*type=["]?application\/x\-shockwave\-flash["]?[^>]*src=[" ]?([^"|^ ]+)["
]?[^>]*>/ig,"\n[swf]$1[/swf]\n");
str = str.replace(/<embed[^>]*src=["]?([^"|^ ]+)["]?[^>]*type=["]?application\/x\-shockwave\-flash
["]?[^>]*>/ig,"\n[swf]$1[/swf]\n");
str = str.replace(/<object[^>]*?CFCDAA03\-8BE4\-11cf\-B84B\-0020AFBBCCFA[^>]*?>.*<param[^>]
+name\s*=\s*["](url|src)["][^>]+value=[" ]?([^"]+)[" ][^>]*>.*<\/object>/ig,"\n[rm]$2[/rm]\n");
}
if(!set.font_b.checked&&!set.stext.checked){
str = str.replace(/<([\/]?)b>/ig,"[$1b]");
str = str.replace(/<([\/]?)strong>/ig,"[$1b]");}
if(!set.font_u.checked&&!set.stext.checked)
str = str.replace(/<([\/]?)u>/ig,"[$1u]");
if(!set.font_i.checked&&!set.stext.checked)
str = str.replace(/<([\/]?)i>/ig,"[$1i]");
str = str.replace(/ /g," ");
str = str.replace(/&/g,"&");
str = str.replace(/"/g,"\"");
str = str.replace(/</g,"<");
str = str.replace(/>/g,">");
}
str = str.replace(/<br>/ig,"\n");
str = str.replace(/<p[^>]*?>/ig,"\n\n");
str = str.replace(/<[^>]*?>/g,"");
str = str.replace(/\[url=([^\]]+)\]\n(\[img\]\1\[\/img\])\n\[\/url\]/g,"$2");
str = str.replace(/\n+/g,"\n");
return str;
}
function copycode(obj){
obj.select();
objcopy=obj.createTextRange();
objcopy.execCommand("Copy");
}
function trans(){
var str = "";
rtf.focus();
rtf.document.body.innerHTML = "";
rtf.document.execCommand("paste");
str = rtf.document.body.innerHTML;
if(str.length == 0) {
alert("剪贴版不存在超文本数据!");
return "";
}
return html_trans(str);
}
function preview(){
var prewin=window.open("","","");
prewin.document.write(rtf.document.body.innerHTML);
}
function zhen(str)
{
strfound=str.replace(/\\/ig,"\\\\");
strfound=strfound.replace(/\[/ig,"\\[");
strfound=strfound.replace(/\]/ig,"\\]");
strfound=strfound.replace(/\{/ig,"\\{");
strfound=strfound.replace(/\}/ig,"\\}");
strfound=strfound.replace(/\|/ig,"\\|");
strfound=strfound.replace(/\//ig,"\\/");
strfound=strfound.replace(/\^/ig,"\\^");
strfound=strfound.replace(/\./ig,"\\.");
strfound=strfound.replace(/\*/ig,"\\*");
strfound=strfound.replace(/\?/ig,"\\?");
strfound=strfound.replace(/\+/ig,"\\+");
return strfound;
}
function replace_star()
{
var str=document.getElementById('text').value;
if(!reg.checked)
strfound=zhen(find_text.value);
else
strfound=find_text.value;
var re = new RegExp(strfound,"ig");
str=str.replace(re,replace_text.value);
document.getElementById('text').value=str;
}
</SCRIPT>
</head>
<body>
<div class="maintable">
<TABLE cellspacing="{INNERBORDERWIDTH}" cellpadding="{TABLESPACE}" width="{TABLEWIDTH}" align="center"
class="tableborder">
<TBODY>
<TR>
<TD bgcolor="#6699CC" height="30"> <font color=#ffffff size=4><B>转贴工具(可屏蔽干扰码)
</B></font></TD>
</TR>
<TR>
<TD align=middle bgColor=#f8f8f8>
<DIV align=center>
<textarea name="textarea" cols=100 class=textarea id=text style="WIDTH: 700px; HEIGHT: 300px"
onbeforepaste="if(document.getElementById('x_paste').checked){window.clipboardData.setData('text',trans
());this.focus();}"></textarea>
<iframe id=rtf
style="WIDTH: 0px; HEIGHT: 0px" marginwidth=0 marginheight=0
src="about:blank" scrolling=no></iframe>
<LABEL
for=x_paste></LABEL></DIV>
<TABLE borderColor=#cccccc cellSpacing=1 width="700px" align=center
bgColor="#6699CC" border=0>
<!--DWLayoutTable-->
<TBODY>
<TR align=middle valign="middle">
<TD width="140" height="44">
<DIV align=left class="STYLE4"><INPUT style="WIDTH: 130px; HEIGHT: 40px"
onClick="document.getElementById('text').value += trans();" type=button value=转换(追加) name=button>
</DIV></TD>
<TD width="130"><input name=button type=button style="WIDTH: 130px; HEIGHT: 40px"
onClick="document.getElementById('text').value = trans()" value=转换(覆盖)></TD>
<TD width="141">
<P align=center class="STYLE4"><INPUT style="WIDTH: 130px; HEIGHT: 40px" onclick=copycode
(window.text) type=button value=复制到剪贴板>
</P></TD>
<TD width="104">
<table width="0" border="0" cellspacing="2" cellpadding="0">
<tr>
<td><INPUT onclick=preview() type=button value=" 预 览 帖 子 " style="WIDTH: 100px; HEIGHT: 20px"
name=preview></td>
</tr>
<tr>
<td><INPUT style="WIDTH: 100px; HEIGHT: 20px" onClick="document.getElementById('text').value=''" type=button
value="清 空 内 容"> </td>
</tr>
</table>
</TD>
<TD width="23%">
<TABLE cellSpacing=2 cellPadding=0 width="100%" border=0>
<TBODY>
<TR align=middle>
<TD class="STYLE4">
<DIV align=center><INPUT title="自动分析所有超链接,并转换成超链接格式
注意:超链接
必须单独在一行中!" style="WIDTH: 80px" onclick=url() type=button value=分析超链接 name=Submit>
</DIV></TD>
<TD>
<DIV align=center><INPUT title=紧凑格式,删除所有空行 style="WIDTH: 80px" onclick=delnull()
type=button value=清除空行 name=Submit>
</DIV></TD></TR>
<TR align=middle>
<TD>
<DIV align=center><INPUT title=清除多余的空行,保持最一个空行 style="WIDTH: 80px"
onclick=refix() type=button value=清除多余 name=Submit>
</DIV></TD>
<TD>
<DIV align=center><INPUT title=为每一行(包括空行)增加一空行 style="WIDTH: 80px"
onclick=addbr() type=button value=增加空行 name=Submit>
</DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<FORM name=set>
<TABLE height=50 cellSpacing=5 cellPadding=0 width="720"
border=0>
<TBODY>
<TR>
<TD title=转换的结果中将不含有图片信息 width="13%" height=20><span class="STYLE2">
<LABEL
for=img>
<INPUT id=img type=checkbox>
屏蔽图片</LABEL>
</span></TD>
<TD title=转换的结果中将不含有链接信息 width="14%"><span class="STYLE2">
<LABEL for=linka>
<INPUT
id=linka type=checkbox>
屏蔽超链接</LABEL>
</span></TD>
<TD title=转换的结果中将不含音频、视频、FLASH等信息 width="14%"><span class="STYLE2">
<LABEL
for=odj>
<INPUT id=odj type=checkbox>
屏蔽对象</LABEL>
</span></TD>
<TD title=转换的结果中将不含文本信息,同时字体属性将被自动屏蔽 width="14%"><span class="STYLE2">
<LABEL
for=stext>
<INPUT id=stext type=checkbox>
屏蔽文字</LABEL>
</span></TD>
<TD title=为了方便帖子的阅读,强制把图片用空行隔开 width="14%"><span class="STYLE2">
<LABEL
for=filtrate>
<INPUT id=filtrate
onclick="if(this.checked)window.base_url.style.display='block';else
window.base_url.style.display='none';"
type=checkbox>
启用图片过滤</LABEL>
</span></TD>
<TD title=屏蔽所有定字体相关的属性 width="14%"><span class="STYLE2">
<LABEL for=font>
<INPUT
id=font
onclick=font_color.checked=this.checked;font_size.checked=this.checked;font_face.checked=this.checked;font_b.checked=
this.checked;font_i.checked=this.checked;font_u.checked=this.checked;
type=checkbox>
屏蔽字体属性</LABEL>
</span></TD>
<TD title=屏蔽所有定字体相关的属性 width="14%"><span class="STYLE2">
<label>
<input type="checkbox" id="fontbash" value="checkbox" checked="checked" />
<span class="STYLE1"> 屏蔽干扰码</span></label>
</span></TD>
</TR>
<TR>
<TD title=转换的结果中将不含有字体颜色信息><span class="STYLE2">
<LABEL for=font_color>
<INPUT
id=font_color type=checkbox>
屏蔽字体颜色</LABEL>
</span></TD>
<TD title=转换的结果中将不含有字体尺寸信息><span class="STYLE2">
<LABEL for=font_size>
<INPUT
id=font_size type=checkbox>
屏蔽字体尺寸</LABEL>
</span></TD>
<TD title=转换的结果中将不含有字体类型信息><span class="STYLE2">
<LABEL for=font_face>
<INPUT
id=font_face type=checkbox>
屏蔽字体类型</LABEL>
</span></TD>
<TD title=转换的结果中将不含有粗体信息><span class="STYLE2">
<LABEL for=font_b>
<INPUT id=font_b
type=checkbox>
屏蔽粗体</LABEL>
</span></TD>
<TD title=转换的结果中将不含有斜体信息><span class="STYLE2">
<LABEL for=font_i>
<INPUT id=font_i
type=checkbox>
屏蔽斜体</LABEL>
</span></TD>
<TD title=转换的结果中将不含有下划线信息><span class="STYLE2">
<LABEL for=font_u>
<INPUT id=font_u
type=checkbox>
屏蔽下划线</LABEL>
</span></TD>
<TD title=转换的结果中将不含有下划线信息><span class="STYLE2"></span></TD>
</TR></TBODY></TABLE>
</FORM>
<TABLE borderColor=#efefef cellSpacing=2 cellPadding=2 width=720
bgColor="#6699CC" border=0>
<TBODY>
<TR>
<TD class=text11 align=middle width="82%"><SPAN
class="text9 style5">查找文字</SPAN> <INPUT id=find_text size=50
name=find_text>
<INPUT onClick="set.reset();find_text.value='';replace_text.value='';window.textfield.value='';"
type=button value=全恢复默认 name=Submit> </TD>
<TD class=text11 align=middle width="18%" rowSpan=2><LABEL
for=reg><INPUT id=reg type=checkbox CHECKED value=1 name=reg>
<SPAN class="text9 style5">使用正则语法</SPAN></LABEL> </TD></TR>
<TR>
<TD class=text11 align=middle><SPAN
class="text9 style5">替换文字</SPAN> <INPUT id=replace_text
size=50 name=replace_text>
<INPUT onclick=replace_star() type=button value=" 开始替换 "
name=Submit></TD></TR></TBODY></TABLE><BR><BR></TD></TR>
<TR bgcolor=#f8f8f8><TD>
<table width="720" border="0" align="center" cellpadding="00" cellspacing="0">
<tr>
<td><p><b>使用说明:</b><br>
1.在网页中拖动鼠标选中你想要的图片或文字,然后鼠标右键“复制(C)”或按Ctrl+C。<br />
2.进入该页面,直接按下“追加转换剪贴板数据”。<br />
3.复制文本筐中的数据,按下“将代码复制到剪贴板”。<br />
4.进入论坛发贴页面,鼠标右键“粘贴(P)”或按Ctrl+V将帖子内容复制到帖子内容筐。<br>
5.乱码过滤功能只在phpwind5.0.1下测试过部分论坛,如果不能正常使用请关掉乱码过滤。<br />
<span class="STYLE1">6.对于没有开启干扰代码的论坛建议去掉屏蔽干扰码的复选框。</span><br />
</p>
<br />
</td>
</tr>
</table>
</TD>
</TR>
</TBODY></TABLE>
<SCRIPT>
rtf.document.designMode="On";
</SCRIPT>
</body>
</html>
评论(2)