php图片防盗链
A. 如何实现网站的防盗链
可以基于OSS的防盗链,目前OSS提供的防盗链的方法主要有两种:
设置Referer。控制台,SDK都可以操作,适合不想写代码的用户,也适合喜欢开发的用户;
签名URL,适合喜欢开发的用户。 本文会给一个控制台设置Referer防盗链的具体事例,也会基于php SDK给一个动态生成签名URL防盗链的示例。
- 第五步:单击“提交”保存对防盗链的设置。
- <?phprequire 'vendor/autoload.php';#最新PHP提供的自动加载use OSSOssClient;#表示命名空间的使用$accessKeyId="a5etodit71tlznjt3pdx7lch";#AccessKeyId,需要使用用户自己的$accessKeySecret="secret_key";#AccessKeySecret,需要用用户自己的$endpoint="oss-cn-hangzhou.aliyuncs.com";#Endpoint,根据Bucket创建的区域来选择,本文中是杭州$bucket = 'referer-test';#Bucket,需要用用户自己的$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$object = "aliyun-logo.png";#需要签名的Object$timeout = 300;#期望链接失效的时间,这里表示从代码运行到这一行开始的当前时间往后300秒$signedUrl = $ossClient->signUrl($bucket, $object, $timeout); #签名URL实现的函数$img= $signedUrl;#将签名URL动态放到图片资源中并打印出来$my_html = "<html>";$my_html .= "<img src="".$img. "" />";$my_html .= "<p>".$img."</p>";$my_html .= "</html>";echo $my_html;?>
使用三级域名URL,例如referer-test.oss-cn-hangzhou.aliyuncs.com/aliyun-logo.png,安全性比绑定二级域名更高。三级域名方式能够提供Bucket级别的清洗和隔离,能够应对被盗链后的流量暴涨的情况,也能避免不同Bucket间的互相影响,最终提高业务可用性;
如果使用自定义域名作为连接,CNAME也请绑定到三级域名,规则是bucket + endpoint。假如你的bucket名为test,三级域名则为test.oss-cn-hangzhou.aliyuncs.com;
对Bucket设定尽可能严格的权限类别。例如提供公网服务的Bucket设置为public-read或private,禁止设置为public-read-write。Bucket权限参见访问控制;
对访问来源进行验证,根据需要设置合适的Referer白名单;
如果需要更严格的防盗链方案,请参考签名的URL方案;
记录Bucket访问日志,能够及时发现盗链活动和验证防盗链方案的有效性。 访问日志参见设置访问日志记录。
通过Referer防盗链的具体步骤
第一步:进入 OSS 管理控制台界面。
第二步:单击目标存储空间的名称进入存储空间管理页面。
第三步:单击 Bucket 属性 > 防盗链设置。
举例
对于一个名为test-1-001的存储空间,设置其referer 白名单为 http://www.aliyun.com。则只有 referer 为http://www.aliyun.com的请求才能访问oss-example这个存储空间中的对象。
签名URL实现步骤
签名URL的原理和实现方法见OSS开发人员指南授权第三方下载。 签名URL的实现步骤:
1、将Bucket的权限设置为私有读;
2、 根据期望的超时时间(签名URL失效的时间)生成签名。
具体实现
第一步:安装PHP最新代码,参考PHP SDK文档;
第二步:实现生成签名URL并将其放在网页中,作为外链使用的简单示例:
第三步:通过浏览器访问 多请求几次会发现签名的URL会变,这是正常的。主要是因为过期时间的改变导致的。这个过期时间是链接失效的时间,是以unix time的形式展示的。 如:Expires=189999,可以将这个时间转换成本地时间。在Linux下的命令为date -d@189999,也可以在网络上找工具自行转换。
特别说明
签名URL可以和Referer白名单功能一起使用。
如果签名URL失效的时间限制在分钟内,盗链用户即使伪造了Referer也必须拿到签名的URL,且必须在有效的时间内才能盗链成功。 相比只使用Referer来说,增加了盗链的难度。 也就是说签名URL配合Referer白名单功能,可以增加防盗链的效果。
防盗链总结,基于OSS的防盗链最佳实践点如下:
B. 如何解决图片防盗链问题
新建一个文件名为img.php。引用方法如下:
http://dome.com/img.php?=微信图片地址
代码如下。
<?php
header("Content-Type:image/png");
$string=$_SERVER["QUERY_STRING"];
/*换一张空白图片,如果遇到错误,需要用上*/
$im=imagecreate(600,300);
$black=imagecolorallocate($im,100,100,100);//图片背景
$white=imagecolorallocate($im,255,255,255);
/*获取图片的真实地址*/
$url=strstr($string,"http");
if(!$url){
imagettftext($im,18,0,200,100,$white,"./fonts/hwxh.ttf","Error001");
imagettftext($im,14,0,150,150,$white,"./fonts/hwxh.ttf","请在参数中输入图片的绝对地址。");
imagepng($im);
exit();
}
@$imgString=urlOpen($url);
if($imgString==""){
imagettftext($im,18,0,200,100,$white,"./fonts/hwxh.ttf","Error002");
imagettftext($im,14,0,70,150,$white,"./fonts/hwxh.ttf","加载远程图片失败,请确认图片的地址能正常访问。");
imagepng($im);
exit();
}
/*如果没有错误*/
$im=imagecreatefromstring($imgString);
$white=imagecolorallocate($im,255,255,255);
/*加上水印*/
//imagettftext($im,12,0,20,20,$white,"./fonts/hwxh.ttf","水印的文字1");
//imagettftext($im,12,0,5,35,$white,"./fonts/hwxh.ttf","水印(可以写你的网址)");
imagepng($im);
/*抓取图片*/
functionurlOpen($url,$data=null,$ua='')
{
if($ua==''){
$ua='MQQBrowser/26Mozilla/5.0(Linux;U;Android2.3.7;zh-cn;MB200Build/GRJ22;CyanogenMod-7)AppleWebKit/533.1(KHTML,likeGecko)Version/4.0MobileSafari/533.1';
}else{
$ua=$ua;
}
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT,$ua);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
curl_close($ch);
return$content;
}
C. PHP文件防盗链了,怎么破解呢
用CURL摸拟请求
$url="目标地址";
//.
functiondisguise_curl($url)
{
$curl=curl_init();
//Setupheaders-.0.0.6
//belowwassplitupbecausephp.netsaidthelinewastoolong.:/
$header[0]="Accept:text/xml,application/xml,application/xhtml+xml,";
$header[0].="text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[]="Cache-Control:max-age=0";
$header[]="Connection:keep-alive";
$header[]="Keep-Alive:300";
$header[]="Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[]="Accept-Language:en-us,en;q=0.5";
$header[]="Pragma:";//browserskeepthisblank.
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_USERAGENT,'Googlebot/2.1');
curl_setopt($curl,CURLOPT_HTTPHEADER,$header);
curl_setopt($curl,CURLOPT_REFERER,'www.google.com');
curl_setopt($curl,CURLOPT_ENCODING,'gzip,deflate');
curl_setopt($curl,CURLOPT_AUTOREFERER,true);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_TIMEOUT,10);
$html=curl_exec($curl);//executethecurlcommand
curl_close($curl);//closetheconnection
return$html;//andfinally,return$html
}
//
$text=disguise_curl($url);
echo$text;
CURLOPT_REFERER这个的值设置成目标网站的域一般都能过。
D. 防盗链的代码处理流程
此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
为什么会产生盗链
一般浏览有一个重要的现象就是一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的解释执行,发现其中还有图片,那么客户端的浏览器会再发送一条Http请求,当这个请求被处理后那么这个图片文件会被传送到客户端,然后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面也许要经过发送多条Http请求才能够被完整的显示。基于这样的机制,就会产生一个问题,那就是盗链问题:就是一个网站中如果没有起页面中所说的信息,例如图片信息,那么它完全可以将这个图片的连接到别的网站。这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现,这样显然,对于那个被利用了资源的网站是不公平的。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。
如何实现防盗链
要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件。换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。
如果想对自己的网站进行防盗链保护,则需要针对不同的情况进行区别对待。如果网站服务器用的是apache,那么使用apache自带的Url Rewrite功能可以很轻松地防止各种盗链,其原理是检查referer,如果referer的信息来自其他网站则重定向到指定图片或网页上。
如果服务器使用的是IIS的话,则需要通过第三方插件来实现防盗链功能了,现在比较常用的一款产品叫做ISAPI_Rewrite,可以实现类似于apache的防盗链功能。另外对于论坛来说还可以使用“登录验证”的方法进行防盗链。
在IE或firefox浏览器中,我们可以使用HttpWatch抓包工具抓取网页的表头信息,该信息就包含了referer段内容,该内容反映的就是用户是从哪个地址到达当前页面的。下面使用PHP语句模拟“限制来路链接只能是本网站地址”的防盗链技术:
<?phpif(isset($_SERVER['HTTP_REFERER'])){//通过字符串处理函数匹配来路URL是否以本站域名打头,是,则说明非盗链if(strpos($_SERVER['HTTP_REFERER']),'http://www.thanks.live')==0){echo "您是通过本站其他页面链接到该页面";}else{echo "本站禁止盗链";}}esle{echo "您是通过类似直接输入当前URL的方式进入该页面的";}?>由于referer值是极易伪造的,所以上述方法只是简单的防盗链。
关于防御方法,有以下3点:
1、不允许referer为空(不建议,因在某些开启隐私模式的浏览器中,或https页面引用下,referer是空的)
2、地址变更(lighttpd的是根据有效时间,nginx的根据是md5)
3、登录校验(如必须登录网站帐号后才能访问)
4.可以借鉴效仿crsf token令牌
二、应对方法
前端脚本
实现代码:
function showImg( url ) {
var frameid = 'frameimg' + Math.random();
window.img = '<img id="img" src=\''+url+'?'+Math.random()+'\' /><script>window.onload = function() { parent.document.getElementById(\''+frameid+'\').height = document.getElementById(\'img\').height+\'px\'; }<'+'/script>';
document.write('<iframe id="'+frameid+'" src="javascript:parent.img;" frameBorder="0" scrolling="no" width="100%"></iframe>');
}
调用方式:
showImg('图片地址');
关于防御方法,有以下3点:
1、不允许referer为空(不建议,因在某些开启隐私模式的浏览器中,或https页面引用下,referer是空的)
2、地址变更(lighttpd的是根据有效时间,nginx的根据是md5)
3、登录校验(如必须登录网站帐号后才能访问)
后端代理:
那么如何才能绕过防盗链对所需资源进行抓取???
php实战
在通常的处理过程中,如果在自己的站点直接引入网络的图片
这里写图片描述
(⊙o⊙)哦,引入链接失败咯啊!!!那么怎么用curl处理
毕竟要爬取必要的信息
$url="https://gss0..com/9fo3dSag_xI4khGko9WTAnF6hhy/image/w%3D210/sign=/.jpg";
//$url = str_replace("http:/","http://",$url);
$dir = pathinfo($url);
$host = $dir['dirname'];
$refer = $host.'/';
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_REFERER, $refer);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
header("Content-type: image/jpeg");
print( $data );
然后么,因为直接print了,所以结果是这样的
这里写图片描述
python实战
Flask响应请求有以下几种方法:
render_template 返回模板文件
jsonify 返回json格式的数据
Response 自定义返回的数据及类型
当服务端需要返回图片或者各种格式的文件时,就需要使用Response进行自定义返
E. 如何用PHP盗链一个图片地址
<?php
header("Content-type: image/jpeg");
echo file_get_contents("http://aaa.com/".$_GET['url']);
?>
记住头尾要干净,要以“<?php”开头不要有BOM,要以“?>”结尾不要有回车
那个类型的header只是提示浏览器,这是个图。至于真正是JPG还是PNG,浏览器会自动识别的。
但是,别人可以防盗链的。当然,你也可以真正模仿浏览器访问,那个就稍微复杂点,用CURL,学了没太大用处的。
F. 怎样防止自己网站上的图片被别人盗用
图片防盗: 是不想自己的图片被别人使用。
图片防盗链: 是不想自己的图片被别人使用,且消耗的是自己的服务器流量。
图片防盗是困难的,完美的图片防盗那几乎是不可能的。但还是有很多方法能够减少图片盗用,下面是10种,选一种你喜欢的吧。
隐藏图片
使用空白图片覆盖真实图片
这个方法可以让别人无法获取真实的图片,除非查看源代码。
你可以把真实的图片做为背景图片,而使用一张透明图片匹配尺寸并覆盖到真实图片上面。
例如:
<div id="image1" style="background-image: url(originalImage.jpg);">
<img src="blank.gif" height="250px" width="300px">
</div>
这样,当别人使用右键查看或保存图片的时候,得到的是这张透明图片。
这里是2个 JavaScript框架可以实现这种图片防盗链方法:
dwProtector for MooTools(dwProtector for jQuery)
自动截切图片
Super Simple Image Tiles
这是一个非常有效的图片防盗链方法。
它支持两种方案:
让用户下载到的是被裁切过的图片。
让用户下载到的是打上水印的图片。
当用户尝试下载图片的时候,它就会进行截切或添加水印操作,但是这个方法也有很大的劣势:
造成太多的服务器请求负荷,对网站整体性能影响不好
你将拥有许多的图片文件
使用带水印的图片 (预先生成)
预先给图片添加水印也是个防止图片被盗的有效方法,就算别人要盗,至少也为你免费宣传了一下自己的网站。
但缺点也来了:
图片会看的不清楚或不美观了(这对于图片展示类的网站尤其重要,但又正是该类网站特尤其图片防盗)
可以下载然后裁剪水印(当然,如果你是那种把水印放在图片中间或水印有图片这么1/3大的家伙,就不用担心这个问题了)
要手动添加水印的话,可以使用PhotoShop,GIMP,轻松水印等软件。也可以选择下面的一些在线图片水印工具:
WatermarkTool
使用水印 (服务器端生成)
使用服务器端自动为图片添加水印,是件省心的事情。只是需要一些脚本知识。
下面是一些相关的各种脚本语言的示例方案:
Asido: PHP Image Processing Library
Asido 是一个PHP图像处理库,可以运行于 GD2, Magick Wand 和 Image Magick.
这里 是 Asido 为图片添加水印的详细说明。