加入客源網
每天多接2個客戶,做生意就是這麼簡單
松山搬家公司電腦滑鼠細菌數
是馬桶400倍

首頁  •  tw 論壇 • 程式設計討論     • 

防止機器人灌水

房東:小強
發表時間:2010-06-14
[檢舉]


class RobotAway
{
/*
$VerifyKey 指定給Client端的驗證碼
$EncodeKey 加密用的key
$ElementID input表單中hidden欄位的id值
$Prefix 驗證函數開頭名稱
$TimeOut 驗證碼時效(分鐘)
$CheckFunctionName 檢驗函數的名稱,這邊也導入了隨機命名,增加混亂度
*/
var $VerifyKey;
var $EncodeKey;
var $ElementID;
var $Prefix;
var $TimeOut;
var $CheckFunctionName;

/*用來產生隨機名稱的函數*/
private function GenerateRandomFunctionName()
{
return \'_\'.substr(md5(time().microtime().rand()),0,rand(10,32));
}

/*
用來將Javascript var變數定義存在一個Array裡
將順序打亂在輸出成一個String
*/
private function GenerateVarDefineString($VarArray)
{
$VarStrings=\'\';
$VarArrayCount=count($VarArray);
for($i=0;$i<=$VarArrayCount;$i++)
{
$RandSwap1=rand(0,$VarArrayCount-1);
$RandSwap2=rand(0,$VarArrayCount-1);
$Tmp=$VarArray[$RandSwap1];
$VarArray[$RandSwap1]=$VarArray[$RandSwap2];
$VarArray[$RandSwap2]=$Tmp;
}
foreach($VarArray as $Index => $VarString)
$VarStrings.=$VarString;
return $VarStrings;
}

/*
在Javascript中加入混淆用註解的函數
*/
private function ConfuseComment()
{
$ConfuseStringPatten=\"0123456789abcdef_+-/,\'\\\";= \";
$ConfuseString=\'\';
$Size=rand(5,10);
for($i=0;$i<$Size;$i++) $ConfuseString.=$ConfuseStringPatten{rand(0,strlen($ConfuseStringPatten)-1)};
return \"/*$ConfuseString*/\";
}
/*
用來將變數打亂然後加上混淆註解的函數
例如
$this->(\'1234567\');
程式輸出結果會變成
[垃圾註解]\'12\'+\'345\'+\'67\'[垃圾註解]
*/
private function Confuse($String)
{
if(strlen($String)<=5) return $this->ConfuseComment().\"\'$String\'\".$this->ConfuseComment();
$ConfusedString=\'\';
$StringLen=strlen($String);
for($i=0;;)
{
$RndStrLen=rand(5,10);
if($RndStrLen>=strlen($String)-$i-1) $RndStrLen=strlen($String)-$i;
$ConfusedString.=$this-> ConfuseComment().\"\'\".substr($String,$i,$RndStrLen).\"\'\".$this-> ConfuseComment().\"+\";
$i+=$RndStrLen;
if($i>=strlen($String)-1) break;
}
return $this->ConfuseComment().\"$ConfusedString\'\'\".$this->ConfuseComment();
}

/*建構函數*/
function __construct($EncodeKey,$ElementID=\'RACheck\',$Timeout=10,$Prefix=\'RA\')
{
$this->ElementID=$ElementID;
$this->Prefix=$Prefix;
$this->GenerateVerifyKey();
$this->TimeOut=$TimeOut;;
}
/*
用來檢驗Client Post送過來的hidden欄位的驗證碼
驗證碼的格式為時間戳記加上兩個md5組成的字串
8byte的時間戳記
32byte ID值
32byte 驗證值
驗證值則是ID跟加密的Key兩個的md5
所以我們只要檢查這個驗證碼是否合法來判別輸入的驗證碼是否正確
就不需額外使用session來存驗證碼了
*/
function Verify($Key)
{
$Time=substr($Key,0,8);
if(($this->TimeOut)&&(hexdec($Time)+$this->TimeOut*60 $ID=substr($Key,8,32);
if($ID!=md5($Time.$this->EncodeKey)) return false;
$CheckValue=substr($Key,40);
$Result=md5($ID.$this->EncodeKey);
return ($Result==$CheckValue);
}
/*
這邊是用來產生驗證碼
ID就是一個亂數產生的識別碼
*/
private function GenerateVerifyKey()
{
$Time=sprintf(\"%x\",time());
$ID=md5($Time.$this->EncodeKey);
$this->VerifyKey=$Time.$ID.md5($ID.$this->EncodeKey);
}
/*
這邊是一個XOR的加密函數
用來將產生的Javascript給加密起來
*/
private function XorEncode($Str,$Key)
{
$KeyLen=strlen($Key);
$EncStr=\'\';
for($i=0;$i {
$BinStr=hexdec(bin2hex($Str{$i}));
$BinKey=hexdec(bin2hex($Key{$i%$KeyLen}));
$EncStr.=pack(\'C\',$BinStr^$BinKey);
}
return urlencode($EncStr);
}
/*
這裡就是整個程式的核心
用來產生隨機的Javascript
*/
function GenerateJS()
{
$VarName=\'_\'.substr(md5(time().microtime().rand()),0,rand(10,32));
$FunctionName=\'_\'.substr(md5(time().microtime().rand()),0,rand(10,32));
$EvalDataEncodeKey=sha1(time().microtime().rand());
$EncodedFunction=\'_\'.substr(md5(time().microtime().rand()),0,rand(10,32));
$EvalDataEncodeKeyName=\'_\'.substr(md5(time().microtime().rand()),0,rand(10,32));
/*
$JS 是用來取得驗證碼的核心Javascript 函數
由於驗證碼是一個64bytes的字串值
這邊我們把他打散並且加密起來
最後產生的Javscript會像這樣
var _df12688fab12=\'xxx\';
_df12688fab12+=\'xxx\';
_df12688fab12+=\'xxx\';
其中變數名稱以及打散的數量是不固定的
*/
$JS=\"var $VarName=\'\';\";
for($i=0;;)
{
$RndStrLen=rand(1,10);
if($RndStrLen>=strlen($this->VerifyKey)-$i-1) $RndStrLen=strlen($this->VerifyKey)-$i;
$JS.=\"$VarName+=\'\".substr($this->VerifyKey,$i,$RndStrLen).\"\';\";
$i+=$RndStrLen;
if($i>=strlen($this->VerifyKey)-1) break;
}
/*
這邊的EvalData就是經過xor加密過後的Javascript函數嘍
$EvalDataEncodeKey 就是解密的Key
*/
$EvalData=$this->XorEncode(\"var $FunctionName\".\'=function(){\'.$JS.\"return $VarName;};\",$EvalDataEncodeKey);

/*
這邊是將Javascript中的var變數宣告加入一個php的array中
透過Confuse這個函數去打亂
最後再組回一段字串成為Javascript輸出
*/
array_push($RandomJSVarDefineList,\"var $EncodedFunction=decodeURIComponent(\".$this->Confuse($EvalData).\");\");
array_push($RandomJSVarDefineList,\"var $EvalDataEncodeKeyName=\".$this->Confuse($EvalDataEncodeKey).\";\");
array_push($RandomJSVarDefineList,\"var $EvalDataName=\".$this->Confuse(\'\').\";\");
//Javascript Start


/*
以下是Javascript的部份
為了方便閱\讀所以把特別排版成這樣
實際輸出時把跳行字元給拿掉節省空間
為了讓大家了解他在做什麼
我幫Javascript加上註解
使用時請把註解給拿掉,節省空間
*/
return str_replace(\"\\n\",\'\',\"
function \".$this->CheckFunctionName.\"()
{
\".$this->GenerateVarDefineString($RandomJSVarDefineList).\"
for(i=0;i<$EncodedFunction.length;i++)
$EvalDataName+=String.fromCharCode($EvalDataEncodeKeyName.charCodeAt(i%$EvalDataEncodeKeyName.length)^$EncodedFunction.charCodeAt(i));
eval($EvalDataName);
document.getElementById(\'\".$this->ElementID.\"\').value=$AssignFunctionName();
}
\");
//Javascript 結束
}
}
?>



  • 贊助網站       

    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!
    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務



  •  共 0 人回應

    姓名:
    佈告內容: