欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

百度空间图片防盗链破解程序

程序员文章站 2022-06-14 21:25:44
...

百度|程序|防盗链|破解

上传百度的图片无法从外部引用,让许多朋友伤透了脑筋,Verdana同学开发出了一个破解程序,可以用一段PHP代码来解决这个问题.本地清空IE 缓存后测试成功,由于没有主机,所以没有在 Internet 上面测试,有条件的朋友可以帮忙测试一下,谢谢!若有兴趣也在此程序基础上继续优化完善

以下是PHP源码.

/**
* 百度空间相册图片防盗链破解程序 - PHP版
*
* 使用方法:
*
*


*
* @author verdana
* @version 1.0
* @since July 16, 2006
*/
Class Frivoller
{
/**
* The HTTP Version (1.0, 1.1) , Baidu use version 1.1
*
* @var string
*/
protected $version;
/**
* The HTTP response body
*
* @var string
*/
protected $body;

/**
* The HTTP URL
*
* @var string
*/
protected $link;
/**
* An array that containing any of the various components of the URL.
*
* @var array
*/
protected $components;
/**
* The HTTP host
*
* @var string
*/
protected $host;
/**
* The path of required file.
* (e.g. '/verdana/abpic/item/mygirl.png')
*
* @var string
*/
protected $path;
/**
* The HTTP referer, extra it from original URL
*
* @var string
*/
protected $referer;
/**
* The HTTP method, 'GET' for default
*
* @var string
*/
protected $method = 'GET';
/**
* The HTTP port, 80 for default
*
* @var int
*/
protected $port = 80;
/**
* Timeout period on a stream
*
* @var int
*/
protected $timeout = 100;
/**
* The filename of image
*
* @var string
*/
protected $filename;
/**
* The ContentType of image file.
* image/jpeg, image/gif, image/png, image
*
* @var string
*/
protected $contentType;
/**
* Frivoller constructor
*
* @param string $link
*/
public function __construct($link)
{
// parse the http link
$this->parseLink($link);
// begin to fetch the image
$stream = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);
if (!$stream) die ("ERROR: $errno - $errstrn");
fputs($stream, $this->buildHeaders());
$this->body = "";
while (!feof($stream)) {
$this->body .= fgets($stream, 4096);
}
// extract picture data
$this->extractBody($this->body);
// send 'ContentType' header for saving this file correctly
// 如果不发送CT,则在试图保存图片时,IE7 会发生错误 (800700de)
// Flock, Firefox 则没有这个问题,Opera 没有测试
header("Content-Type: $this->contentType");
print $this->body;
// save this picture
// file_put_contents('hello.jpg', $this->body);
fclose($stream);
}
/**
* Compose HTTP request header
*
* @return string
*/
private function buildHeaders()
{
$request = "$this->method $this->path HTTP/1.1rn";
$request .= "Host: $this->hostrn";
$request .= "Content-Type: image/jpegrn";
$request .= "Accept: */*rn";
$request .= "Keep-Alive: 300rn";
$request .= "Connection: closern";
$request .= "Referer: $this->refererrn";
$request .= "Cache-Control: max-age=315360000rnrn";
return $request;
}
/**
* Strip initial header and filesize info
*/
private function extractBody(&$body)
{
// The status of link
if(strpos($body, '200 OK') > 0) {
// strip header
$endpos = strpos($body, "rnrn");
$body = substr($body, $endpos + 4);
// strip filesize at nextline
$body = substr($body, strpos($body, "rn") + 2);
}
}
/**
* Extra the http url
*
* @param $link
*/
private function parseLink($link)
{
$this->link = $link;
$this->components = parse_url($this->link);
$this->host = $this->components['host'];
$this->path = $this->components['path'];
$this->referer = $this->components['scheme'] . '://' . $this->components['host'];
$this->filename = basename($this->path);

// extract the content type
$ext = substr(strrchr($this->path, '.'), 1);
if ($ext == 'jpg' or $ext == 'jpeg') {
$this->contentType = 'image/pjpeg';
}
elseif ($ext == 'gif') {
$this->contentType = 'image/gif';
}
elseif ($ext == 'png') {
$this->contentType = 'image/x-png';
}
elseif ($ext == 'bmp') {
$this->contentType = 'image/bmp';
}
else {
$this->contentType = 'application/octet-stream';
}
}
}
// Get the url, maybe you should check the given url
if (isset($_GET['url']) and $_GET['url'] != '') {
new Frivoller($_GET['url']);
}
?>