《防跨站提交和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.vephp.com')!==0) exit('勿跨站提交');
不过,这种方法并不靠谱,因为来源是很容易伪造的。不过,你还是要使用,目的是排除一些新手。再进一步就要令牌和加密串等方式来验证来源的可靠性。
在几乎所有的采集程序中,除非是新手写的,否则都会伪造来源referer地址。那如何伪造来源?
二、伪造referer来源的方式:
这里分别介绍CURL、SOCKET、file_get_contents实现方法,详细代码如下:
1、CURL方式:
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.vephp.com");
curl_setopt ($ch, CURLOPT_REFERER, "http://iframe.vephp.com"); #伪造
curl_exec ($ch);
curl_close ($ch);
2、SOCKET方式:
$server = 'www.vephp.com';
$host = 'www.vephp.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.vephp.com/jiaocheng/56.html