防跨站提交和PHP伪造来源referer地址的方法
《防跨站提交和PHP伪造来源referer地址的方法》要点: 如今网络上十分流行论坛自动发帖机,自动顶贴机等,给众多论坛网站带来了大量的垃圾信息,许多网站只是简单地采用了判断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.jb51.cc')!==0) exit('勿跨站提交'); 不过,这种方法并不靠谱,因为来源是很容易伪造的。不过,你还是要使用,目的是排除一些新手。再进一步就要令牌和加密串等方式来验证来源的可靠性。 在几乎所有的采集程序中,除非是新手写的,否则都会伪造来源referer地址。那如何伪造来源? 二、伪造referer来源的方式: 这里分别介绍CURL、SOCKET、file_get_contents实现方法,详细代码如下: 1、CURL方式: $ch = curl_init(); curl_setopt ($ch,CURLOPT_URL,"http://www.jb51.cc"); curl_setopt ($ch,CURLOPT_REFERER,"http://www.jb51.cc"); #伪造 curl_exec ($ch); curl_close ($ch);
2、SOCKET方式: $server = 'www.jb51.cc'; $host = 'www.jb51.cc'; $target = 'index.php'; $referer = 'http://vecms.jb51.cc'; #伪造 $port = 80; $fp = fsockopen($server,$port,$errno,$errstr,30); if (!$fp){ echo "$errstr ($errno)n"; }else{ $out = "GET $target HTTP/1.1rn"; $out .= "Host: $hostrn"; $out .= "Referer: $refererrn"; $out .= "Connection: Closernrn"; 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、验证码、令牌、加密等多种方式验证。 (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |