《防跨站提交和PHP偽造來源referer地址的方法》要點:
本文介紹了防跨站提交和PHP偽造來源referer地址的方法,希望對您有用。如果有疑問,可以聯系我們。
相關主題:PHP安全
如今網絡上十分流行論壇自動發帖機,自動頂貼機等,給眾多論壇網站帶來了大量的垃圾信息,許多網站只是簡單地采用了判斷HTTP_REFERER的值來進行過濾機器發帖,可是網頁的HTTP_REFERER來路信息是可以被偽造的。
一、首先來談跨站:
在PHP防止跨站提交表單或跨站訪問時,一般會先取來源頁,如下SOURCE_PAGE:
//來源頁設置 $refererTmp = !empty($_SERVER['HTTP_REFERER']) ? safe_UrlFilter($_SERVER['HTTP_REFERER']) : ''; define('SOURCE_PAGE', addslashes($refererTmp)); //來源
//防止HTTP響應拆分功擊 //所有網址和寫入到header,setcookie()只要涉及網址,均需過濾。 function safe_UrlFilter($url) { $url = htmlspecialchars(strip_tags(str_replace(array("\r","\n","%0a","%0d"),'',$url)),ENT_QUOTES,'utf-8'); return trim($url); }
然后把SOURCE_PAGE和你的域名對比
if(stripos(SOURCE_PAGE,'http://www.fzlkiss.com')!==0) exit('勿跨站提交');
不過,這種方法并不靠譜,因為來源是很容易偽造的。不過,你還是要使用,目的是排除一些新手。再進一步就要令牌和加密串等方式來驗證來源的可靠性。
在幾乎所有的采集程序中,除非是新手寫的,否則都會偽造來源referer地址。那如何偽造來源?
二、偽造referer來源的方式:
這里分別介紹CURL、SOCKET、file_get_contents實現方法,詳細代碼如下:
1、CURL方式:
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.fzlkiss.com");
curl_setopt ($ch, CURLOPT_REFERER, "http://iframe.vephp.com"); #偽造
curl_exec ($ch);
curl_close ($ch);
2、SOCKET方式:
$server = 'www.fzlkiss.com';
$host = 'www.fzlkiss.com';
$target = 'index.php';
$referer = 'http://vecms.vephp.com'; #偽造
$port = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp){
echo "$errstr ($errno)\n";
}else{
$out = "GET $target HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Referer: $referer\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)){
echo fgets($fp, 128);
}
fclose($fp);
}
3、file_get_contents方法:
$opt=array('http'=>array('header'=>"Referer: $refer"));
$context=stream_context_create($opt);
$file_contents = file_get_contents($url,false, $context);
因此,單純判斷referer是不可靠的,在安全性要求較高時,需要采用IP、驗證碼、令牌、加密等多種方式驗證。
轉載請注明本頁網址:
http://www.fzlkiss.com/jiaocheng/56.html