python referer伪造_php伪造Referer请求反盗链资源
有些产品为了防止自己的产品被盗链访问,会采用反盗链措施,如封闭型生态的音乐网站和视频网站,他们已经为了版权付费,自然不希望你免费使用他们的资源。但因为很多人专门研究盗链,因此我们也需要了解下盗链、反盗链和逃避反盗链的原理。
盗链
引用百度百科对盗链的定义:
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
常规盗链
我们知道,网站提供服务是向服务端请求一个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-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例子来完成这个功能:
$url = 'http://t11.baidu.com/it/u=3008889497,862090385&fm=77';
$refer = 'https://www.baidu.com';
$ch = curl_init();
//以url的形式 进行请求
curl_setopt($ch, CURLOPT_URL, $url);
//以文件流的形式 进行返回 不直接输出到浏览器
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//浏览器发起请求 超时设置
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
//伪造来源地址
curl_setopt ($ch, CURLOPT_REFERER, $refer);
$file = curl_exec($ch);
curl_close($ch);
header('Content-Type: text/html');
// 对图片进行base64编码,然后返回给前端展示
$file = base64_encode($file);
echo "";
?>
我们第一次请求注释了伪造来源地址这一行,第二次请求不注释这一行,这样可以验证执行结果:
总结
盗链和反盗链是一个对立面,技术不断升级,最终的目标也是为了开放资源和保护知识产权。在互联网生态里,我们通过反盗链保护我们的利益,也使用防反盗链的这种方式来扩大我们的内容,无论站在哪一方,都需要做到知己知彼。
参考文章
python referer伪造_php伪造Referer请求反盗链资源相关推荐
- 文章抓取显示盗链 php,盗链是什么?php怎么伪造Referer请求反盗链资源(附示例)...
本篇文章给大家带来的内容是关于盗链是什么?php怎么伪造Referer请求反盗链资源(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 有些产品为了防止自己的产品被盗链访问,会 ...
- js 伪造referer_详解php伪造Referer请求反盗链资源
有些产品为了防止自己的产品被盗链访问,会采用反盗链措施,如封闭型生态的音乐网站和视频网站,他们已经为了版权付费,自然不希望你免费使用他们的资源.但因为很多人专门研究盗链,因此我们也需要了解下盗链.反盗 ...
- java 修改 referer_Java 通过设置Referer反盗链
下面是完整的代码. package cn.searchphoto.util; import java.io.File; import java.io.FileOutputStream; import ...
- Python《第一次爬虫遭遇反盗链(上)》
今天想爬取下往上很多人都爬取过的https://www.mzitu.com/ . 结果很尴尬,只能很浅显地爬取一些首页图片,因为遭遇到了反盗链. 鉴于图片过于那啥,其实我就来搞学习的,也不是什么LSP ...
- http中的反盗链技术的例子实现
一.背景 1.接着上一篇的内容继续研究了下http请求的反盗链技术,请参考我的上一篇博文:https://blog.csdn.net/chenmingxu438521/article/details/ ...
- 小程序的防盗链 VS 反盗链 - 总结篇
小程序的防盗链 VS 反盗链 - 总结篇>最近做小程序的时候,产品要求做防盗链处理,特意网罗了一下,貌似都只是一些手段而已. 抛砖总结一篇,仅供参考. 一.防盗链 1. 事件的起因 为何要设置小 ...
- Python《第一次爬虫遭遇反盗链(下)》
上一篇博文,我遇到了防止盗链的问题, 防盗链原理 http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么 因此所有防 ...
- java 微信图片反盗链_详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案...
已经获取微信公众号发布的图片,但不能正常显示 ,提示:此图片来自微信公众平台 未经允许不得引用. 这是怎么回事呢? 遇到这种问题是因为微信公众平台对图片采用了防盗链设置,微信对外提供了API接口,让我 ...
- html 图片防盗链,【反防盗链】介绍一个对付图片防盗链的方法
悲催的声明: 由于腾讯也采用了防盗链技术,本文方法已经失效了! 当我们想在文章里引用某张图片时,如果对方设置了防盗链,我们看到的将是404或forbidden或其他图片,而不是想要的那张图片,为此,我 ...
最新文章
- 安装Android SDK需要选择哪些,开始为Android开发,我应该选择安装哪些SDK?
- 0-1 背包问题的 4 种解决方法算法策略
- 图解python_图解Python深拷贝和浅拷贝
- webService 客户端接口调用【java】
- vue 新窗口打开外链接
- 【演化学习】初识platEMO-MOEA/D、NSGA-Ⅱ-DTLZ、HV
- android n进入分屏代码分析_完全不用鼠标写代码!你信么?[视频]
- Adobe全系列软件介绍
- 生活之美--需要设计
- go如何实现图片拼接,文字书写
- 普适计算的六大必备条件
- 计算机班级学生分析,【本班学生学业成绩状况】_本班学生情况分析报告
- el-table-column 内容不自动换行
- C语言【微项目01】—电话号码管理系统(文件操作实现)【2021-06-29】
- keepalived配置,解决vip无法ping通,虚拟服务器端口无法访问的问题
- mysql 登录错误 ERROR 2002 (HY000)
- App 用户新体验——Agora Native SDK 3.4.0
- 龙光“五一”热销数十亿,领跑全国楼市
- 前端zrender框架使其可拖拽
- 需求分析——数据字典
热门文章
- Android4.4 Sensor APP--HAL代码流程
- Android.mk中的LOCAL_OVERRIDES_PACKAGES
- php 实现二叉树的最大深度_LintCode 题解丨Apple面试题:二叉树的最大深度
- python抽学号程序_python:简单的学生管理系统
- java代码进行短信接收_自动化测试-自动获取手机短信验证码
- post url 后面跟参数_都2019年了,还问GET和POST的区别
- java构造函数的执行顺序,java构造函数和初始化函数的执行顺序
- mysql 分页拦截器_MyBatis 拦截器 (实现分页功能)
- sse java8_Java SSE 服务器推送WEB页面接收数据
- 百度分享代码_网销侠:网络营销百问百答之51,百度小程序是什么