当前位置: 首页 > 后端技术 > PHP

phpfakesReferer请求防盗链资源

时间:2023-03-30 00:06:26 PHP

有些产品会采取防盗链措施,防止产品被盗链访问,比如生态封闭的音乐网站、视频网站。他们已经为版权付费了,自然不想让你免费使用他们的资源。但是因为很多人都是专门做盗链的,所以我们也需要了解一下盗链、防盗链、防盗链的规避原理。盗链是指百度百科对盗链的定义:盗链是指服务商自己不提供服务的内容,通过技术手段绕过其他有益的最终用户界面(如广告),直接在自己的网站上向最终用户提交内容.用户提供其他服务商的服务内容,骗取终端用户的浏览率和点击率。受益者不提供资源或提供的资源很少,而真正的服务提供者却得不到任何好处。常规的盗链,我们知道网站是通过向服务器请求一个html文件来提供服务的。此文件包含css/js文件和img/video标签。这些静态资源会在加载html文件的时候一一发起请求。填写指定位置即可完成整个页面的加载。所以,我们只要拿到这张图片的url,嵌入到我们自己的html文件中,就可以在我们的网站上访问了。由于资源是通过不同的HTTP请求独立访问的,所以我们也可以过滤源站点的html文件。这是最简单的热链接。危害:用户访问时,并不是在访问被盗链的网站,但仍会占用网站的带宽资源,需要向运营商支付带宽费用。同时,网站的广告、周边、宣传等资源不会被用户访问。分布式盗链分布式盗链比较复杂,需要在服务器端部署专门的程序。它不针对单个网站或单个URL,而是窃取整个网络上所有有用的资源,并将它们存储在自己的数据库中,而当用户实际访问时,则完全转化为自己的流量。危害:自己通过劳动、金钱、版权付费获得的资源,可以被盗链网站免费使用,如网店照片、期刊、电视剧等,其会员和服务无法盈利。防盗链分类当我们了解了源站盗链的危害之后,自然要通过一些手段来防范这种行为,保护自己的利益。添加水印是最简单的方法。您可以通过后台程序为图片等资源批量添加水印。这样,在盗链的同时,也在推广自己的网站,甚至有的时候还主动寻求这种盗链。资源重命名因为盗链是通过指定的url,这个url必须包含资源的路径和名称,所以通过不定期更改文件或目录的名称,可以快速避免盗链,但也会导致正在下载的资源被盗用打断了。HTTP请求的头信息中有一个字段:referer,代表发起请求的页面。如果在单独的页面上打开或服务器请求,则此字段为空。因此,我们可以通过referer字段的值来进行限制。如果是我们自己识别的页面,则返回资源,否则禁止请求。但是,由于每次都需要打开白名单文件进行url匹配,性能会有所降低。加密认证是在客户端通过用户认证信息和资源名称进行加密,加密后的字符串作为url的参数发起请求,服务器解密后才会返回请求的资源并通过认证。该方法主要用于防止分布式盗链。在防盗链程序上面的三种防盗链方法中,我们经常使用的是第三种,它利用referer属性来完成防盗链。今天主要来分享一下这个防盗链防盗链的方法。后端程序限制这个限制需要消耗服务器端的计算资源,所以不像Nginx限制那么常见。$from=parse_url($_SERVER['HTTP_REFERER']);if($from['host']!='xxx.com'&&$from['host']!='www.xxx.com'){死('Youarehotlinking');}Nginx限制可以通过修改nginx配置文件来实现,修改完成后记得重启nginx://这里指定需要防盗链的资源,比如gif/jpg等。location~*\.(gif|jpg|png|jpeg)${//设置资源过期时间expires30d;//设置合法参考页面,即防盗链白名单;//noneblocked确保用户在打开新页面时仍然可以打开,如果不希望用户可以保存和删除这两个valid_referersnoneblocked*.hugao8.com*.baidu.com*.google.com;//对于非法引用页面,可以重写图片,也可以直接返回403或404页面if($invalid_referer){rewrite^/http://www.it300.com/static/images/404.jpg;#返回404;}}Referer-PolicyReferer头包含了当前请求页面的源页面地址,表示当前页面是通过这个源页面中的链接进入的。服务器端一般使用Referer头来标识访问源,可用于统计分析、日志记录、缓存优化等。Referer属性出现在请求头中,也设置在请求头中,但是在浏览器的安全策略中,js不能指定这个值:$.ajax({url:'http://www.baidu.com',beforeSend(xhr){//在发送ajax请求前设置headerxhr.setRequestHeader("Referer","http://translate.google.com/");xhr.setRequestHeader("User-Agent","stagefright/1.2(Linux;Android5.0)");},success(data){console.log(data);},error(err){console.log(err);}});但是浏览器会报错:那么Referer是如何自动设置的呢?这取决于Referer-Policy属性是如何定义的:no-referrer:整个Referer头将被删除。Referrer信息不会随请求一起发送。no-referrer-when-downgrade(默认):未指定策略时用户代理的默认行为。在安全级别相同的情况下,将发送引用页面的地址(HTTPS->HTTPS),但在降级(HTTPS->HTTP)的情况下将不会发送。origin:在任何情况下都只发送文件的来源作为引用。例如https://example.com/page.html将https://example.com/作为引荐来源网址。origin-when-cross-origin:对于同源请求,完整的URL将作为referrer发送,但对于非同源请求,仅发送文件的来源。same-origin:同源请求发送referer信息,非同源请求不发送referer信息。strict-origin:在相同安全级别的情况下,发送文件的来源作为referrer(HTTPS->HTTPS),降级(HTTPS->HTTP)时不发送。strict-origin-when-cross-origin:对于同源请求,将发送完整的URL作为参考地址;在安全级别相同的情况下,文件的来源将作为参考地址发送(HTTPS->HTTPS);在(HTTPS->HTTP)的情况下不发送此标头。unsafe-url:无论是同源请求还是非同源请求,都发送完整的URL(去掉参数信息后)作为referrer地址。这个值可以通过三种方式设置:防盗链前端JS是不能在header中设置Referer字段的,因为浏览器的安全策略等同于跨域,所以服务器端同样的请求会没有这些限制,我们可以在服务器请求时自由修改Referer字段。我们通过一个简单的PHP例子来完成这个功能:";?>我们在第一次请求中注释了假源地址这一行,在第二次请求中没有注释这行,这样可以验证执行结果:Summaryof盗链和防盗链是相反的,技术不断升级,最终目的是开放资源和保护知识产权。在互联网生态中,我们通过防盗链来保护自己的利益,我们也通过防盗链来拓展我们的内容。无论站在哪一边,我们都需要知己知彼。参考文章百科-盗链:https://baike.baidu.com/item/...php反盗链:https://segmentfault.com/q/10...Referer伪造:https://zhuanlan.zhihu.com/p/...nginx防盗链:https://www.jianshu.com/p/979...