防跨站提交和PHP伪造来源referer地址的方法

《防跨站提交和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.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、验证码、令牌、加密等多种方式验证。

dawei

【声明】:唐山站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。