Web资源防盗链
盗链:在自己的页面上展示一些并不在自己服务器上的内容。获得他人服务器上的地源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容
常见的是小站盗用大战的图片、音乐、视频、软件等资源。通过倒链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。如果有一天发现我们的流量慢慢消失,但是我们的PV统计、IP统计很少就是被盗链了。
随便找个网站查看network在我们的PHP文件加上去就可以了。
防盗链概念:防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。让他403!
可以大大减轻服务器以及贷款的压力
工作原理:通过Referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以根据到显示它的网页地址。
一单检测到来源不是本站即进行阻止或者返回指定页面
就是network下面请求头信息有一个Referer,代表来源,可以通过技术来限制其他网站的盗链。还有就是比如一个图片我可以给他带一个参数,这个参数是彼此之间约定好的一个签名,签名的计算方式是约定好的。服务器显示的时候去判断这个签名是否正确。通过计算签名的方式,判断请求是否合法,如果合法显示,否则返回错误信息。
Nginx模块ngx_http_referer_module用于组织来源非法的域名请求
Nginx指令valid_referers,全局变量$invalid_referer
Referer
valid_referernone | blocked | server_names |string …;
none:可写可不写,代表referer是否为空,如果写none代表referer为空也合法,不写表示来源为空不合法,一般需要加,因为本身通过浏览器访问是合法的确保直接用浏览器是可以访问的。
blocked:”Referer”来源头部不为空,但是里面的值被代理或者被防火墙删除了,这些值都不以http://或者https://开头
server_names:referer来源头部包含当前的server_names,也就是被允许的源列表
例子/usr/local/nginx/conf/nginx.conf中(首先要看模块安没安装)
location~.*\.(gif|jpg|png|flv|swf|rar|zip)$ #当访问这些结尾的文件时
{
Valid_referersnone blocked jhkj.com*.jhkj.com;
If($invalid_referer) #全局变量,如果合法就是false
{
#return403;
rewrite^/ http://www.jhkj.com/403.jpg;
}
}
盗链人员也可以伪造referer比如说php的模拟curl请求,给你传递一个头信息叫做referer,这个referer由他自定义,这样就可以进行伪装,就可以吧防盗链数据都窃取出来。所以这种方式虽然可以,但是对防盗链不能彻底防范,只能是提高一些门槛。
针对目录的防盗链
Location/images/ #当访问这些结尾的文件时
{
Valid_referersnone blocked jhkj.com*.jhkj.com;
If($invalid_referer) #全局变量,如果合法就是false
{
#return403;
rewrite^/ http://www.jhkj.com/403.jpg;
}
}
比如在写location直接写目录也可以直接配置的,以上是rerfer进行防盗链,但是会被伪造referer,所以可以使用加密签名来解决。当我们请求图片是我们要带一些签名,返回图片判断签名是否正确,就是一个暗号
加密签名:第三方模块HttpAccessKeyModule实现Nginx防盗链。因为在浏览器里面在服务端php中我去显示一个图片是跟了一个签名,Nginx做一个判断,判断这个前面是否正确,这时候就需要HAKM。
Accesskey on|off 模块开关
Acesskey_hashmethod md5|sha-1 签名加密方式,签名的哈希方法选择
Accesskey_arg GET参数名称,传递一个前面,要知道签名的键是什么
Acesskey_signature 加密规则,在PHP的规则要和Nginx的规则一致
Location~.*\.(gif|jpg|png|flv|swf|rar|zip)$
{
Accesskey on;
Acesskey_hashmethod md5;
Accesskey_arg sign;
Acesskey_signature “chaojifuzademima123$remote_addr”;
}
$remote_addr是客户端IP,前面随意去写的,大家猜不出来的。本质就是字符串拼接客户端ID,通过MD5加密就得到了签名,判断两个值是否一致,一致就显示,否则就403它!
为了让能够访问要加参数:在php中加入
$sign = md5(‘chaojifuzademima123’.$_SERVER[‘REMOTE_ADDR’]);
echo ‘<img src=”./logo_new.png?sig=’.$sign.’”>’; #请求这张图片带了sign的参数
