《防跨站提交和PHP偽造來(lái)源referer地址的方法》要點(diǎn):
本文介紹了防跨站提交和PHP偽造來(lái)源referer地址的方法,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
相關(guān)主題:PHP安全
如今網(wǎng)絡(luò)上十分流行論壇自動(dòng)發(fā)帖機(jī),自動(dòng)頂貼機(jī)等,給眾多論壇網(wǎng)站帶來(lái)了大量的垃圾信息,許多網(wǎng)站只是簡(jiǎn)單地采用了判斷HTTP_REFERER的值來(lái)進(jìn)行過(guò)濾機(jī)器發(fā)帖,可是網(wǎng)頁(yè)的HTTP_REFERER來(lái)路信息是可以被偽造的。
一、首先來(lái)談跨站:
在PHP防止跨站提交表單或跨站訪問(wèn)時(shí),一般會(huì)先取來(lái)源頁(yè),如下SOURCE_PAGE:
//來(lái)源頁(yè)設(shè)置 $refererTmp = !empty($_SERVER['HTTP_REFERER']) ? safe_UrlFilter($_SERVER['HTTP_REFERER']) : ''; define('SOURCE_PAGE', addslashes($refererTmp)); //來(lái)源
//防止HTTP響應(yīng)拆分功擊 //所有網(wǎng)址和寫(xiě)入到header,setcookie()只要涉及網(wǎng)址,均需過(guò)濾。 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和你的域名對(duì)比
if(stripos(SOURCE_PAGE,'http://www.snjht.com')!==0) exit('勿跨站提交');
不過(guò),這種方法并不靠譜,因?yàn)閬?lái)源是很容易偽造的。不過(guò),你還是要使用,目的是排除一些新手。再進(jìn)一步就要令牌和加密串等方式來(lái)驗(yàn)證來(lái)源的可靠性。
在幾乎所有的采集程序中,除非是新手寫(xiě)的,否則都會(huì)偽造來(lái)源referer地址。那如何偽造來(lái)源?
二、偽造referer來(lái)源的方式:
這里分別介紹CURL、SOCKET、file_get_contents實(shí)現(xiàn)方法,詳細(xì)代碼如下:
1、CURL方式:
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.snjht.com");
curl_setopt ($ch, CURLOPT_REFERER, "http://iframe.vephp.com"); #偽造
curl_exec ($ch);
curl_close ($ch);
2、SOCKET方式:
$server = 'www.snjht.com';
$host = 'www.snjht.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是不可靠的,在安全性要求較高時(shí),需要采用IP、驗(yàn)證碼、令牌、加密等多種方式驗(yàn)證。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/56.html