木子屋 Dnawo's BLOG

干扰码

👤 dnawo 📅 2007-01-07 👁 11981 👍 0 💬 2 🔄 本站原创
以前54master博客里加了干扰码,正常复制粘贴文字时会出一堆乱七八糟的文字,后来觉得满有趣再去看时却没了这个功能,就无从查起。再后来无意中听说Discuz里头有干扰码这一功能开关,却又一直没有时间去看,这个周末又想了起来,决定好好研究下其个中究竟。

安装调试好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"。

示例一:
HTML
<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>


示例二:
HTML
<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
<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)

Mr.W 2007-01-08 04:02
请站长放出PJ的手动修改方法!谢谢...
mzwu 2007-01-08 09:40
请参考我在PJ官方论坛上传的文件:http://bbs.pjhome.net/viewthread.php?tid=13493&highlight=%2Bdnawo
计算题
评论需审核通过后显示
← 上一篇 首次托管服务器经验完全手册 下一篇 → Replace函数返回值