资讯专栏INFORMATION COLUMN

php伪造Referer请求反盗链资源

Drinkey / 1800人阅读

摘要:反盗链分类我们了解了盗链对源站的危害后,自然要通过一些手段来阻止这种行为维护自己的利益。参考文章百科盗链防盗链伪造防盗链

有些产品为了防止自己的产品被盗链访问,会采用反盗链措施,如封闭型生态的音乐网站和视频网站,他们已经为了版权付费,自然不希望你免费使用他们的资源。但因为很多人专门研究盗链,因此我们也需要了解下盗链、反盗链和逃避反盗链的原理。

盗链

引用百度百科对盗链的定义:

盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
常规盗链

我们知道,网站提供服务是向服务端请求一个html文件,这个文件中包含有css/js文件,也包含img/video标签,这些静态资源会在html文件加载时,依次的发起请求并填充在指定位置上,从而完成整个页面的加载。

因此只要拿到这个图片的URL并嵌入我们自己的html文件中,就能在我们的网站上访问,由于资源是不同的HTTP请求独立访问的,因此我们也能过滤源站的html文件。这就是最简单的盗链。

危害:在用户访问时,并没有在访问被盗链网站,但是依然会占用该网站的带宽资源,而带宽是要给运营商付费的。同时,该网站的广告、周边、宣传等资源并不会被用户访问到。

分布式盗链

分布式盗链比较复杂,需要在服务端部署专门的程序,并不针对单个网站或单个url,而是对全网的所有有用的资源进行盗取,并存储在自己的数据库中,并在用户实际访问时,完全转换为自己的流量。

危害:自己通过劳动、金钱、版权付费得到的资源,被盗链网站免费使用,如网店摄影图、期刊、电视剧等。并因此导致自己的会员、服务无法实现盈利。

反盗链分类

我们了解了盗链对源站的危害后,自然要通过一些手段来阻止这种行为维护自己的利益。

加水印

这是最简单的方法,通过后端程序批量对图片等资源加上水印,这样在盗链的同时,也在为自己的网站做宣传,有时甚至会主动寻求这种盗链。

资源重命名

因为盗链是通过指定的url,这个url中一定包含该资源的路径和名称,因此通过不定期的更改文件或目录的名称,能够快速避免盗链,但也会导致正在下载的资源被中断。

限制引用页

http请求的头部信息中,有一个字段:referer,它代表这个请求是从哪个页面发起的,如果是多带带在页面中打开或者服务端请求的,则这个字段为空。因此我们可以通过referer这个字段的值做限制,如果是自己认可的页面,则返回资源,否则,禁止该请求。但是由于每次都要打开一个白名单的文件做url匹配,因此会降低性能。

加密认证

在客户端通过将用户认证的信息和资源的名称进行组合后加密,将加密的字符串作为url的参数发起请求,在服务端进行解密并认证通过后,才会返回请求的资源。这个方式主要用于防范分布式盗链。

反盗链程序

上面的3种反盗链方式,我们常用的是第三种,通过referer属性来完成反盗链,今天也主要分享这一种方法的反盗链与防反盗链。

后端程序限制

这种限制需要消耗服务端计算资源,因此不如Nginx限制常用。

$from = parse_url($_SERVER["HTTP_REFERER"]);
if ($from["host"]!="xxx.com" && $from["host"]!="www.xxx.com") {
    die("你丫在盗链");
}
Nginx限制

通过修改nginx配置文件可以做到,修改完成后记得重启nginx

// 这里指定需要防盗链的资源,如gif/jpg等
location ~* .(gif|jpg|png|jpeg)$ {
    // 设置资源的过期时间
    expires 30d;
    // 设置合法的引用页,也就是防盗链的白名单;
    // none blocked保证用户在新页面打开时依然能够打开,如果不希望用户能够保存删掉这两项
    valid_referers none blocked *.hugao8.com *.baidu.com *.google.com;
    // 对于非法的引用页,可以重写图片,也可以直接返回403或404页面
    if ($invalid_referer) {
        rewrite ^/http://www.it300.com/static/images/404.jpg;
        #return 404;
    }
}
Referer-Policy
Referer 首部包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 首部识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

Referer属性出现在请求头中,也在请求头中被设置,但是在浏览器的安全策略里,该值无法被js所指定:

$.ajax({
        url: "http://www.baidu.com",
        beforeSend(xhr) {
            // 在发送ajax请求前设置header头部
            xhr.setRequestHeader("Referer", "http://translate.google.com/");
            xhr.setRequestHeader("User-Agent", "stagefright/1.2 (Linux;Android 5.0)");
        },
        success(data) {
            console.log(data);
        },
        error(err) {
            console.log(err);
        }
});

然而浏览器会报错:

那么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(移除参数信息之后)作为引用地址。

这个值可以通过三种方式来设置:



防反盗链

前端JS不能在头部设置Referer字段,和跨域一样是因为浏览器的安全策略,那么同样的在服务端进行请求就不会有这些限制,我们在服务端请求时就可以自由的修改Referer字段。

我们通过简单的PHP例子来完成这个功能:

我们第一次请求注释了伪造来源地址这一行,第二次请求不注释这一行,这样可以验证执行结果:

总结

盗链和反盗链是一个对立面,技术不断升级,最终的目标也是为了开放资源和保护知识产权。在互联网生态里,我们通过反盗链保护我们的利益,也使用防反盗链的这种方式来扩大我们的内容,无论站在哪一方,都需要做到知己知彼。

参考文章

百科-盗链:https://baike.baidu.com/item/...

php防盗链:https://segmentfault.com/q/10...

Referer伪造:https://zhuanlan.zhihu.com/p/...

nginx防盗链:https://www.jianshu.com/p/979...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40323.html

相关文章

  • php伪造Referer请求盗链资源

    摘要:反盗链分类我们了解了盗链对源站的危害后,自然要通过一些手段来阻止这种行为维护自己的利益。参考文章百科盗链防盗链伪造防盗链 有些产品为了防止自己的产品被盗链访问,会采用反盗链措施,如封闭型生态的音乐网站和视频网站,他们已经为了版权付费,自然不希望你免费使用他们的资源。但因为很多人专门研究盗链,因此我们也需要了解下盗链、反盗链和逃避反盗链的原理。 盗链 引用百度百科对盗链的定义: 盗链是指...

    chenatu 评论0 收藏0
  • PHP面试之二:高并发与大数据

    摘要:三态分别是就绪运行阻塞进程的五态模型在三态的基础上发展而来新建态运行态终止态就绪态等待态线程称之为轻量级的进程,程序执行流的最小单元。一个进程下有多个线程来完成不同的工作称之为多线程。 web资源防盗链 盗链是什么? 为什么要防? 在自己页面上显示一些不是自己服务器的资源(图片、音频、视频、css、js等)由于别人盗链你的资源会加重你的服务器负担,所以我们需要防止可能会影响统计 防盗链...

    Ashin 评论0 收藏0
  • 20170813-CSRF 跨站请求伪造

    摘要:是的缩写,翻译过来就是跨站请求伪造。要抵御,关键在于在请求中放入黑客无法伪造的信息。通过这个类,可以一次性给所有该类请求加上这个头属性,并把值放入其中。参考对跨站请求伪造的理解浅谈攻击方式跨站脚本攻击与跨站请求伪造攻击的学习总结。 CSRF CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造。 跨站:顾名思义,就是从一个网站到另一个网站。 ...

    missonce 评论0 收藏0
  • 一篇文章解读阿里云视频点播内容安全机制

    摘要:阿里云视频点播提供了完善的内容安全保护机制,可以满足不同业务场景的安全需求。通用性标准加密阿里云视频加密标准加密可适配所有播放场景阿里云视频加密仅支持阿里云播放器。 摘要: 如何保障视频内容的安全,不被盗链、非法下载和传播,是困扰众多企业已久的问题,特别是独播剧、在线教育、财经金融、行业培训等在线版权视频领域尤为迫切,处理不好会造成极为严重的经济损失,甚至法律风险。阿里云视频点播提供了...

    cncoder 评论0 收藏0
  • Servlet第四篇【request对象常用方法、应用】

    摘要:浏览器的中文数据提交给服务器,以编码对中文编码,当我在读取数据的时候,拿到的当然是乱码。接下来使用方式传递中文数据,把表单的方式改成即可当我们访问的时候,又出现乱码了于是我按照上面的方式,把对象设置编码为试试结果还是乱码。 什么是HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信...

    CoorChice 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<