fsockopen应对防盗链

别的开了防盗链,加载的时候特别难看,想到一般防盗链都是基于referer参数的

所以在请求的时候加上referer参数,就可轻松绕过防盗链机制

例如以下,内容可能因为盗链而布恩那个正常显示

想到可以利用fsockopen带上referer等参数,去获取图片然后显示出来,相关PHP代码类似如下:

    $url = 'http://bjimg.focus.cn/images/phpkq4X6Xwg.jpg';//$_REQUEST['url'];
    $url = parse_url($url);

    $referer = isset($_REQUEST['referer'])?$_REQUEST['referer']:$url['host'];
    $port = isset($url['port'])?$url['port']:80;
    $crlf = chr(13).chr(10);

    $fsp = fsockopen($url['host'],$port,$errno,$errstr,30);
    if(!$fsp)
    {
        $fp = fopen('./err.log','a');
        fwrite($fp,"[".date('Y-m-d H:i:s')."]ERROR $error : $errstr /r/n");
        fclose($fp);
        die("Requsert fail!");
    }
    $header = "GET ".$url['path']." HTTP/1.1/r/n";
    $header .= "Host: ".$url['host']."/r/n";
    $header .= "Referer: $referer/r/n";
    $header .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 /r/n";
    $header .= "Connection: keepalive/r/n/r/n";
    fwrite($fsp,$header);
    $pathinfo=pathinfo($url['path']);
    $image_ext=$pathinfo['extension'];
    header("content-type:image/".$image_ext);
    $image = null;
    while(!feof($fsp))
    {
        $target = fgets($fsp);
        if(substr($target,-2)!=$crlf)
            $image .= $target;
    }
    fclose($fsp);
echo $image;
?>

这时img标签就可以写成类似如下

当然这个或其他的方法也可以,比如CURL扩展.

你可能感兴趣的:(php)