• 售前

  • 售后

热门帖子
入门百科

详解php伪造Referer请求反盗链资源

[复制链接]
123457505 显示全部楼层 发表于 2021-10-26 14:11:55 |阅读模式 打印 上一主题 下一主题
有些产品为了防止本身的产品被盗链访问,会接纳反盗链措施,如封闭型生态的音乐网站和视频网站,他们已经为了版权付费,自然不希望你免费利用他们的资源。但由于很多人专门研究盗链,因此我们也需要相识下盗链、反盗链和躲避反盗链的原理。
盗链
引用百度百科对盗链的定义:
盗链是指服务提供商本身不提供服务的内容,通过技能本事绕过别的有长处的终极用户界面(如广告),直接在本身的网站上向终极用户提供别的服务提供商的服务内容,骗取终极用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
常规盗链
我们知道,网站提供服务是向服务端哀求一个
  1. html
复制代码
文件,这个文件中包含有
  1. css/js
复制代码
文件,也包含
  1. img/video
复制代码
标签,这些静态资源会在
  1. html
复制代码
文件加载时,依次的发起哀求并添补在指定位置上,从而完成整个页面的加载。

因此只要拿到这个图片的
  1. URL
复制代码
并嵌入我们本身的
  1. html
复制代码
文件中,就能在我们的网站上访问,由于资源是差别的
  1. HTTP
复制代码
哀求独立访问的,因此我们也能过滤源站的
  1. html
复制代码
文件。这就是最简朴的盗链。
危害:在用户访问时,并没有在访问被盗链网站,但是依然会占用该网站的带宽资源,而带宽是要给运营商付费的。同时,该网站的广告、周边、宣传等资源并不会被用户访问到。
分布式盗链
分布式盗链比力复杂,需要在服务端部署专门的步调,并不针对单个网站或单个
  1. url
复制代码
,而是对全网的所有有效的资源进行偷取,并存储在本身的数据库中,并在用户实际访问时,完全转换为本身的流量。
危害:本身通过劳动、款项、版权付费得到的资源,被盗链网站免费利用,如网店拍照图、期刊、电视剧等。并因此导致本身的会员、服务无法实现红利。
反盗链分类
我们相识了盗链对源站的危害后,自然要通过一些本事来阻止这种行为维护本身的长处。
加水印
这是最简朴的方法,通事后端步调批量对图片等资源加上水印,这样在盗链的同时,也在为本身的网站做宣传,偶然乃至会自动寻求这种盗链。
资源重命名
由于盗链是通过指定的url,这个
  1. url
复制代码
中一定包含该资源的路径和名称,因此通过不定期的更改文件或目次的名称,可以或许快速制止盗链,但也会导致正在下载的资源被制止。
限定引用页
  1. http
复制代码
哀求的头部信息中,有一个字段:
  1. referer
复制代码
,它代表这个哀求是从哪个页面发起的,假如是单独在页面中打开或者服务端哀求的,则这个字段为空。因此我们可以通过
  1. referer
复制代码
这个字段的值做限定,假如是本身认可的页面,则返回资源,否则,克制该哀求。但是由于每次都要打开一个白名单的文件做
  1. url
复制代码
匹配,因此会降低性能。
加密认证
在客户端通过将用户认证的信息和资源的名称进行组合后加密,将加密的字符串作为
  1. url
复制代码
的参数发起哀求,在服务端进行解密并认证通事后,才会返回哀求的资源。这个方式紧张用于防范分布式盗链。
反盗链步调
上面的3种反盗链方式,我们常用的是第三种,通过
  1. referer
复制代码
属性来完成反盗链,本日也紧张分享这一种方法的反盗链与防反盗链。
后端步调限定
这种限定需要斲丧服务端盘算资源,因此不如
  1. Nginx
复制代码
限定常用。
  1. $from = parse_url($_SERVER['HTTP_REFERER']);
  2. if ($from['host']!='xxx.com' && $from['host']!='www.xxx.com') {
  3.   die('你丫在盗链');
  4. }
复制代码
Nginx 限定
通过修改
  1. nginx
复制代码
配置文件可以做到,修改完成跋文得重启
  1. nginx
复制代码
  1. // 这里指定需要防盗链的资源,如gif/jpg等
  2. location ~* \.(gif|jpg|png|jpeg)$ {
  3.   // 设置资源的过期时间
  4.   expires 30d;
  5.   // 设置合法的引用页,也就是防盗链的白名单;
  6.   // none blocked保证用户在新页面打开时依然能够打开,如果不希望用户能够保存删掉这两项
  7.   valid_referers none blocked *.hugao8.com *.baidu.com *.google.com;
  8.   // 对于非法的引用页,可以重写图片,也可以直接返回403或404页面
  9.   if ($invalid_referer) {
  10.     rewrite ^/http://www.it300.com/static/images/404.jpg;
  11.     #return 404;
  12.   }
  13. }
复制代码
Referer-Policy
  1. Referer
复制代码
首部包含了当前哀求页面的来源页面的地址,即表现当前页面是通过此来源页面里的链接进入的。服务端一般利用
  1. Referer
复制代码
首部辨认访问来源,大概会以此进行统计分析、日志纪录以及缓存优化等。
  1. Referer
复制代码
属性出现在哀求头中,也在哀求头中被设置,但是在浏览器的安全策略里,该值无法被
  1. js
复制代码
所指定:
  1. $.ajax({
  2.     url: 'http://www.baidu.com',
  3.     beforeSend(xhr) {
  4.       // 在发送ajax请求前设置header头部
  5.       xhr.setRequestHeader("Referer", "http://translate.google.com/");
  6.       xhr.setRequestHeader("User-Agent", "stagefright/1.2 (Linux;Android 5.0)");
  7.     },
  8.     success(data) {
  9.       console.log(data);
  10.     },
  11.     error(err) {
  12.       console.log(err);
  13.     }
  14. });
复制代码
然而浏览器会报错:

那么
  1. Referer
复制代码
是怎么被自动设置的呢?这个得看 Referer-Policy属性 是怎么定义的:
      
  • no-referrer : 整个 Referer 首部会被移除。访问来源信息不随着哀求一起发送。  
  • no-referrer-when-downgrade (默认值): 在没有指定任何策略的情况下用户署理的默认行为。在划一安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。  
  • origin : 在任何情况下,仅发送文件的源作为引用地址。比方 https://example.com/page.html 会将 https://example.com/ 作为引用地址。  
  • origin-when-cross-origin : 对于同源的哀求,会发送完备的URL作为引用地址,但是对于非同源哀求仅发送文件的源。  
  • same-origin : 对于同源的哀求会发送引用地址,但是对于非同源哀求则不发送引用地址信息。  
  • strict-origin : 在划一安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。  
  • strict-origin-when-cross-origin : 对于同源的哀求,会发送完备的URL作为引用地址;在划一安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。  
  • unsafe-url : 无论是同源哀求还是非同源哀求,都发送完备的 URL(移除参数信息之后)作为引用地址。
这个值可以通过三种方式来设置:
  1. <meta name="referrer" content="origin">
  2. <a href="http://example.com" rel="external nofollow" rel="external nofollow" referrerpolicy="origin">
  3. <a href="http://example.com" rel="external nofollow" rel="external nofollow" rel="noreferrer">
复制代码
防反盗链
前端
  1. JS
复制代码
不能在头部设置
  1. Referer
复制代码
字段,和跨域一样是由于浏览器的安全策略,那么同样的在服务端进行哀求就不会有这些限定,我们在服务端哀求时就可以自由的修改
  1. Referer
复制代码
字段。
我们通过简朴的
  1. PHP
复制代码
例子来完成这个功能:
  1. <?php
  2. $url = 'http://t11.baidu.com/it/u=3008889497,862090385&fm=77';
  3. $refer = 'https://www.baidu.com';
  4. $ch = curl_init();
  5. //以url的形式 进行请求
  6. curl_setopt($ch, CURLOPT_URL, $url);
  7. //以文件流的形式 进行返回 不直接输出到浏览器
  8. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  9. //浏览器发起请求 超时设置
  10. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  11. //伪造来源地址
  12. curl_setopt ($ch, CURLOPT_REFERER, $refer);
  13. $file = curl_exec($ch);
  14. curl_close($ch);
  15. header('Content-Type: text/html');
  16. // 对图片进行base64编码,然后返回给前端展示
  17. $file = base64_encode($file);
  18. echo "<img src='data:image/jpeg;base64,{$file}' />";
  19. ?>
复制代码
我们第一次哀求解释了
  1. 伪造来源地址
复制代码
这一行,第二次哀求不解释这一行,这样可以验证实行效果:


总结
盗链和反盗链是一个对立面,技能不停升级,终极的目标也是为了开放资源和保护知识产权。在互联网生态里,我们通过反盗链保护我们的长处,也利用防反盗链的这种方式来扩大我们的内容,无论站在哪一方,都需要做到知己知彼。
以上就是本文的全部内容,希望对各人的学习有所资助,也希望各人多多支持脚本之家。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作