解析php下载远程图片函数 可伪造来路


Posted in PHP onJune 25, 2013

gurl 要下载的图片地址
$rfurl 来路。如果目标图像做了防盗链设置,可以绕过。
$filename 下载图片保存的文件名,相对路径,不要用realpath
$gcookie 调整cookie 伪造的cookie
$JumpCount 跳转计数
$maxtime 最大次数
调用方法:DownImageKeep(“http://www.baidu.com/img/baidu_jgylogo2.gif”,”http://baidu.com”,”a.gif”,”",0,10);

<?php
function DownImageKeep($gurl, $rfurl, $filename, $gcookie="", $JumpCount=0, $maxtime=30)
{
    $urlinfos = GetHostInfo($gurl);
    $ghost = trim($urlinfos['host']);
    if($ghost=='')
    {
        return FALSE;
    }
    $gquery = $urlinfos['query'];
    if($gcookie=="" && !empty($rfurl))
    {
        $gcookie = RefurlCookie($rfurl);
    }
    $sessionQuery = "GET $gquery HTTP/1.1\r\n";
    $sessionQuery .= "Host: $ghost\r\n";
    $sessionQuery .= "Referer: $rfurl\r\n";
    $sessionQuery .= "Accept: */*\r\n";
    $sessionQuery .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\n";
    if($gcookie!="" && !preg_match("/[\r\n]/", $gcookie))
    {
        $sessionQuery .= $gcookie."\r\n";
    }
    $sessionQuery .= "Connection: Keep-Alive\r\n\r\n";
    $errno = "";
    $errstr = "";
    $m_fp = fsockopen($ghost, 80, $errno, $errstr,10);
    fwrite($m_fp,$sessionQuery);
    $lnum = 0;
    //获取详细应答头
    $m_httphead = Array();
    $httpstas = explode(" ",fgets($m_fp,256));
    $m_httphead["http-edition"] = trim($httpstas[0]);
    $m_httphead["http-state"] = trim($httpstas[1]);
    while(!feof($m_fp))
    {
        $line = trim(fgets($m_fp,256));
        if($line == "" || $lnum>100)
        {
            break;
        }
        $hkey = "";
        $hvalue = "";
        $v = 0;
        for($i=0; $i<strlen($line); $i++)
        {
            if($v==1)
            {
                $hvalue .= $line[$i];
            }
            if($line[$i]==":")
            {
                $v = 1;
            }
            if($v==0)
            {
                $hkey .= $line[$i];
            }
        }
        $hkey = trim($hkey);
        if($hkey!="")
        {
            $m_httphead[strtolower($hkey)] = trim($hvalue);
        }
    }
    //分析返回记录
    if(preg_match("/^3/", $m_httphead["http-state"]))
    {
        if(isset($m_httphead["location"]) && $JumpCount<3)
        {
            $JumpCount++;
            DownImageKeep($gurl,$rfurl,$filename,$gcookie,$JumpCount);
        }
        else
        {
            return FALSE;
        }
    }
    if(!preg_match("/^2/", $m_httphead["http-state"]))
    {
        return FALSE;
    }
    if(!isset($m_httphead))
    {
        return FALSE;
    }
    $contentLength = $m_httphead['content-length'];
    //保存文件
    $fp = fopen($filename,"w") or die("写入文件:{$filename} 失败!");
    $i=0;
    $okdata = "";
    $starttime = time();
    while(!feof($m_fp))
    {
        $okdata .= fgetc($m_fp);
        $i++;
        //超时结束
        if(time()-$starttime>$maxtime)
        {
            break;
        }
        //到达指定大小结束
        if($i >= $contentLength)
        {
            break;
        }
    }
    if($okdata!="")
    {
        fwrite($fp,$okdata);
    }
    fclose($fp);
    if($okdata=="")
    {
        @unlink($filename);
        fclose($m_fp);
        return FALSE;
    }
    fclose($m_fp);
    return TRUE;
}
/**
 *  获得某页面返回的Cookie信息
 *
 * @access    public
 * @param     string  $gurl  调整地址
 * @return    string
 */
function RefurlCookie($gurl)
{
    global $gcookie,$lastRfurl;
    $gurl = trim($gurl);
    if(!empty($gcookie) && $lastRfurl==$gurl)
    {
        return $gcookie;
    }
    else
    {
        $lastRfurl=$gurl;
    }
    if(trim($gurl)=='')
    {
        return '';
    }
    $urlinfos = GetHostInfo($gurl);
    $ghost = $urlinfos['host'];
    $gquery = $urlinfos['query'];
    $sessionQuery = "GET $gquery HTTP/1.1\r\n";
    $sessionQuery .= "Host: $ghost\r\n";
    $sessionQuery .= "Accept: */*\r\n";
    $sessionQuery .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\n";
    $sessionQuery .= "Connection: Close\r\n\r\n";
    $errno = "";
    $errstr = "";
    $m_fp = fsockopen($ghost, 80, $errno, $errstr,10) or die($ghost.'<br />');
    fwrite($m_fp,$sessionQuery);
    $lnum = 0;
    //获取详细应答头
    $gcookie = "";
    while(!feof($m_fp))
    {
        $line = trim(fgets($m_fp,256));
        if($line == "" || $lnum>100)
        {
            break;
        }
        else
        {
            if(preg_match("/^cookie/i", $line))
            {
                $gcookie = $line;
                break;
            }
        }
    }
    fclose($m_fp);
    return $gcookie;
}
/**
 *  获得网址的host和query部份
 *
 * @access    public
 * @param     string  $gurl  调整地址
 * @return    string
 */
function GetHostInfo($gurl)
{
    $gurl = preg_replace("/^http:\/\//i", "", trim($gurl));
    $garr['host'] = preg_replace("/\/(.*)$/i", "", $gurl);
    $garr['query'] = "/".preg_replace("/^([^\/]*)\//i", "", $gurl);
    return $garr;
}
?>

PHP 相关文章推荐
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
Jul 05 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
Nov 27 PHP
PHP判断变量是否为0的方法
Feb 08 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
Feb 22 PHP
php中bind_param()函数用法分析
Mar 28 PHP
thinkphp5实现无限级分类
Feb 18 PHP
PHP的简单跳转提示的实现详解
Mar 14 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 #PHP
使用dump函数,给php加断点测试
Jun 25 #PHP
解析php多线程下载远程多个文件
Jun 25 #PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 #PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
Jun 25 #PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 #PHP
使用php判断网页是否gzip压缩
Jun 25 #PHP
You might like
phpMyadmin 用户权限中英对照
2010/04/02 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
可输入的下拉框
2006/06/19 Javascript
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
javascript 继承实现方法
2009/08/26 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
Node.js使用cookie保持登录的方法
2018/05/11 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
python mock测试的示例
2020/10/19 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
租房合同协议书
2014/04/09 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
小学生手册家长意见
2015/06/03 职场文书
地道战观后感400字
2015/06/04 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
MySQL 字符集 character
2022/05/04 MySQL