解析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实现框架(一)
Oct 09 PHP
用PHP开发GUI
Oct 09 PHP
提升PHP速度全攻略
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
支付宝接口开发集成支付环境小结
Mar 17 PHP
Apache连接PHP后无法启动问题解决思路
Jun 18 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
Laravel框架中缓存的使用方法分析
Sep 06 PHP
PHP Web表单生成器案例分析
Jun 02 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
php中Ctype函数用法详解
2014/12/09 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
深入理解Python异常处理的哲学
2019/02/01 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
python3.7添加dlib模块的方法
2020/07/01 Python
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
审核会计岗位职责
2013/11/08 职场文书
采购员的工作职责
2013/12/26 职场文书
施工员岗位职责
2014/03/16 职场文书
校园元旦活动总结
2014/07/09 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
教师个人学习总结
2015/02/11 职场文书
以权谋私检举信范文
2015/03/02 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
预备党员介绍人意见
2015/06/01 职场文书
Redis+AOP+自定义注解实现限流
2022/06/28 Redis