用PHP伪造referer突破网盘禁止外连的代码

yipeiwu_com7年前PHP代码库

比如我放纳米盘里的文件http://img.namipan.com/downfile/da333ee178bdad6531d1ec1540cf86277c116b6300887600/02.Paid%20In%20Full.mp3

这个地址不能直接下载也不能在网页播放器里播放,点击下载转到了一个下载页面。要想能够直接下载这个文件或播放这个文件,那就要伪造referfer,欺骗服务器,referfer是来自纳米盘的链接。

最开始使用的方法是用PHP内置的函数stream_context_create。

代码如下: 

复制代码 代码如下:

function referfile($url, $refer=”) {
$opt=array('http'=>array('header'=>”Referer: $refer”));
$context=stream_context_create( $opt);
return file_get_contents($url,false, $context);
}


但这段代码有个缺点,file_get_contents实际上是把对方服务器的文件读取到了自己的服务器上然后再发送给浏览器,不但加大自己服务器的压力,而且下载反应速度还很慢,这个并不是很好的解决方法。

后来又看了遍手册,既要减轻自己服务器的压力,又能达到迷惑对方服务器。修改header里的Referfer信息就可以了。

改版后的代码如下:
复制代码 代码如下:

<?php
$url="img.namipan.com/downfile/da333ee178bdad6531d1ec1540cf86277c116b6300887600/02.Paid%20In%20Full.mp3";//这里的url要过滤掉http://
$urlarr=explode("/",$url);
$domain=$urlarr[0];//分解出域名
$getfile=str_replace($urlarr[0],",$url);
$content = @fsockopen("$domain", 80, $errno, $errstr, 12);//先连接上对方的服务器
if (!$content){//无法链接就提示错误信息
die("对不起,无法连接上 $domain 。");
}
fputs($content, "GET $getfile HTTP/1.0\r\n");
fputs($content, "Host: $domain\r\n");
fputs($content, "Referer: $domain\r\n");//伪造referfer
fputs($content, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");

while (!feof($content)) {
$tp.=fgets($content, 128);将头部信息读取出来,里面将包含:Location:http://xxx/xxx.mp3,我们要的就是这个地址。
}
$arr=explode("\n",$tp);
$arr1=explode("Location: ",$tp);
$arr2=explode("\n",$arr1[1]);//分解出Location:后面的地址
header('Content-Type:application/force-download');
header("location:".$arr2[0]);
fclose($content);


OK,目的达到了。

这个原来的地址:http://img.namipan.com/downfile/3a7c64518d46d986283eab73175a8b119305a76480b89200/Equilibrium-Turis_Fratyr-02-Wingthors_Hammer.mp3

转换后:

http://mms.music.krmcn.com/mms.music/namipan/img~~/3a7c64518d46d986283eab73175a8b119305a76480b89200/Equilibrium-Turis_Fratyr-02-Wingthors_Hammer.mp3

附另外一段实现代码:

最原始的破解网盘限制外链的php代码,如果各位想要学习研究可以继续看,如果要拿代码直接用需要改进,这个代码仅供参考学习。

新建一个文件file.php。后面的参数就是需要伪造referfer的目标地址吧。如:file.php/http://www.xxx.xxx/xxx.mp3

复制代码 代码如下:

<?
$url=str_replace('/file.php/','',$_SERVER["REQUEST_URI"]);//得出需要转换的网址。这里我就偷懒,不做安全检测了,需要的自己加上去
$downfile=str_replace(" ","%20",$url);//替换空格之类,可以根据实际情况进行替换
$downfile=str_replace("http://","",$downfile);//去掉http://
$urlarr=explode("/",$downfile);//以"/"分解出域名
$domain=$urlarr[0];//域名
$getfile=str_replace($urlarr[0],'',$downfile);//得出header中的GET部分
$content = @fsockopen("$domain", 80, $errno, $errstr, 12);//连接目标主机
if (!$content){//链接不上就提示错误
die("对不起,无法连接上 $domain 。");
}
fputs($content, "GET $getfile HTTP/1.0\r\n");
fputs($content, "Host: $domain\r\n");
fputs($content, "Referer: $domain\r\n");//伪造部分
fputs($content, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");

while (!feof($content)) {
$tp.=fgets($content, 128);
if (strstr($tp,"200 OK")){ //这里要说明一下。header的第一行一般是请求文件的状态。具体请参照HTTP 1.1状态代码及其含义hi.baidu.com/110911/blog/item/21f20d2475af812ed50742c5.html这里 是正常的文件请求状态,只需直接转向就可以。其他状态的继续执行程序

header("Location:$url");
die();
}
}

//302 转向,大部分的防盗链系统都是先判断referfer,对了的话再转向真实的地址。下面就是获取真实的地址。
$arr=explode("\n",$tp);
$arr1=explode("Location: ",$tp);//分解出Location后面的真时地址
$arr2=explode("\n",$arr1[1]);
header('Content-Type:application/force-download');//强制下载
header("location:".$arr2[0]);//转向目标地址
die();
?>

115网盘图片外链测试(不是我做的):原版地址:http://u.115.com/file/f3b7c9046
外链地址:/zb_users/upload/202003/xsfxcrg22hk.jpg

115网盘外链测试2(也不是我做的):http://gg.org.ru/115.php/提取码/xxx

相关文章

PHP学习笔记之数组篇

一、如何定义数组:在PHP中创建数组主要有两种方式,下面就让我们来看看如何创建一个数组 (1)直接给每个元素赋值的方法创建数组。 格式为:$arrayname[key]=value; 其...

基于PHPExcel的常用方法总结

复制代码 代码如下:// 通常PHPExcel对象有两种实例化的方式// 1. 通过new关键字创建空白文档$phpexcel = newPHPExcel();// 2. 通过读取已有的...

php数组函数序列之array_combine() - 数组合并函数使用说明

array_combine() 定义和用法 array_combine() 函数通过合并两个数组来创建一个新数组,其中的一个数组是键名,另一个数组的值为键值。 如果其中一个数组为空,或者...

PHP 文件写入和读取操作实例详解【必看篇】

PHP 文件写入和读取操作实例详解【必看篇】

本文实例讲述了PHP 文件写入和读取操作。分享给大家供大家参考,具体如下: 文章提纲: 一.实现文件读取和写入的基本思路 二.使用fopen方法打开文件 三.文件读取和文件写入操作...

php实现微信公众号无限群发

利用微信客服接口进行各类消息的无限群发 sendAllMsg.php <?php /* Author:yf 使用说明:微信公众号无限...