解析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新手上路(十一)
Oct 09 PHP
PHP中的日期及时间
Nov 23 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
php中随机显示图片的函数代码
Jun 23 PHP
php实现用户在线时间统计详解
Oct 08 PHP
php调用Google translate_tts api实现代码
Aug 07 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
如何使用php实现评委评分器
Jul 31 PHP
php编程每天必学之验证码
Mar 03 PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 PHP
PHP实现小程序批量通知推送
Nov 27 PHP
PHP验证类的封装与使用方法详解
Jan 10 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+mysql扎实个人基本功
2008/03/27 PHP
php 无极分类(递归)实现代码
2010/01/05 PHP
php-fpm配置详解
2014/02/12 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
python远程登录代码
2008/04/29 Python
极简的Python入门指引
2015/04/01 Python
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
django 常用orm操作详解
2017/09/13 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
公务员个人自我评价分享
2013/11/06 职场文书
专科毕业生自我鉴定
2013/12/01 职场文书
酒店总经理欢迎词
2014/01/15 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
简历中个人自我评价分享
2014/03/15 职场文书
公司口号大全
2014/06/11 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
学期个人自我总结
2015/02/13 职场文书
2015年食品安全工作总结
2015/05/15 职场文书