解析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 相关文章推荐
让你的网站首页自动选择语言转跳
Dec 06 PHP
一段php加密解密的代码
Jul 16 PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
PHP生成唯一订单号
Jul 05 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP levenshtein()函数用法讲解
Mar 08 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 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创建PDF中文文档
2006/10/09 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
yii数据库的查询方法
2015/12/28 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
js中bool值的转换及“&amp;&amp;”、“||”、 “!!”详解
2017/12/21 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
建筑学推荐信
2013/11/03 职场文书
实习生自荐信范文分享
2013/11/27 职场文书
党员作风建设整改方案
2014/10/27 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
生产车间管理制度
2015/08/04 职场文书
合作合同协议书
2016/03/21 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers