解析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 相关文章推荐
第九节--绑定
Nov 16 PHP
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
解析php file_exists无效的解决办法
Jun 26 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
Jun 30 PHP
PHP内存使用情况如何获取
Oct 10 PHP
php对接java现实加签验签的实例
Nov 25 PHP
php smtp实现发送邮件功能
Jun 22 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
php生成毫秒时间戳的实例讲解
Sep 22 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
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
详解node中创建服务进程
2017/05/09 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
基于python中theano库的线性回归
2018/08/31 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
如何使用python传入不确定个数参数
2020/02/18 Python
网络专业学生个人的自我评价
2013/12/16 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
中学教师师德承诺书
2014/05/23 职场文书
公司收款委托书范本
2014/09/20 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
初中毕业生感言
2015/07/31 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
golang使用map实现去除重复数组
2022/04/14 Golang