为PHP页面跳转和跨站提交伪造Referer地址
天缘博客留言链接暂时都是使用URL跳转的,在博客网页跳转中,原本使用了meta标签跳转,可惜跳转后REFERER参数丢失,也就是说从天缘博客跳转出去的地址,都是无法看到天缘博客http://www.metsky.com这个来路的,而是直接输入网址访问某个页面,虽然做好事不留名非常高尚,不过还是想学习研究一下这几个常用跳转方法的效果,经过测试发现使用window.location.href和window.location.replace也是无法达到传递REFERER效果。
一、尝试过的URL跳转方法
echo '<meta http-equiv="refresh" content="0; URL='.$url.'">';
echo '<scrīpt language="Javascrīpt">window.location.href="'.$url.'";</scrīpt>';
echo '<script language="Javascrīpt">window.location.replace="'.$url.'";</ script>';
以上三种方法均无法传递REFERER地址。
二、使用PHP Socket函数伪造REFER
下面是PHP伪造REFERER代码部分,经过测试可以实现REFERER地址传递,其中$url是输入地址。
$uinfo = parse_url($url);//解析URL地址,比如http://www.metsky.com/archives/1.html
if($uinfo['path']) //
$data = $uinfo['path'];//这里得到/archives/1.html
else
$data = '/';//默认根
if(!$fsp = @fsockopen($uinfo['host'], (($uinfo['port']) ? $uinfo['port'] : "80"), $errno, $errstr, 12)){
echo "对不起对方网站暂时无法打开,请您稍后访问:".$uinfo['host']; exit;
}else{
fputs($fsp, "GET “.$data .” HTTP/1.0\r\n");//如果是跨站POST提交,可使用POST方法
fputs($fsp, "Host: ".$uinfo['host']."\r\n");
fputs($fsp, "Referer: www.metsky.com\r\n");//伪造REFERER地址
fputs($fsp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");
$res='';
while(!feof($fsp)) {
$res.=fgets($fsp, 128);
if(strstr($res,"200 OK")) {
header("Location:$url"); exit;
}
}
}
//如果是301或302状态码可以继续处理
//返回地址大概形式:HTTP/1.1 301 Moved Permanently\nContent-Length: 164\nContent-Type: text/html\nLocation: http://www.metsky.com/
$arr=explode("\n",$res);
$arr=explode(": ",$arr[3]);//Location后面是真实重定向地址
header("location:".$arr[0]);//跳转目标地址
exit;
//这里如果还有301还需要再次处理,从略。
写完本文突然发现,PHP伪造REFERER可能在盗链或跨站提交中应用极大,比如跨站提交留言表单或盗链下载地址等,代码放在这里与大家共享,良好的互联网环境需要我们共同创造,建议大家就不要去搞跨站了。
各位网友:
——如果您有更好的方法,欢迎留言补充交流!
更多文章:
