本文就来说一个主要提供变量并修改变量的值的模块,也就是我们要讲的防盗链模块:referer 模块。
成都创新互联公司凭借专业的设计团队扎实的技术支持、优质高效的服务意识和丰厚的资源优势,提供专业的网站策划、网站制作、成都网站制作、网站优化、软件开发、网站改版等服务,在成都10余年的网站建设设计经验,为成都1000+中小型企业策划设计了网站。
如果做过个人站点的同学,可能会遇到别人盗用自己站点资源链接的情况,这就是盗链。说到盗链就要说一个 HTTP 协议的 头部,referer 头部。当其他网站通过 URL 引用了你的页面,用户在浏览器上点击 URL 时,HTTP 请求的头部会通过 referer 头部将该网站当前页面的 URL 带上,告诉服务器本次请求是由谁发起的。
例如,在谷歌中搜索 Nginx 然后点击链接:
在打开的新页面中查看请求头会发现,请求头中包含了 referer 头部且值是 https://www.google.com/ 。
像谷歌这种我们是允许的,但是有一些其他的网站想要引用我们自己网站的资源时,就需要做一些管控了,不然岂不是谁都可以拿到链接。
这里目的其实已经很明确了,就是要拒绝非正常的网站访问我们站点的资源。
invalid_referer 变量
要实现上面的目的,referer 模块可得算头一号,一起看下 referer 模块怎么用的。
--without-http_referer_module
禁用referer 模块有三个指令,下面看一下。
- Syntax: valid_referers none | blocked | server_names | string ...;
- Default: —
- Context: server, location
- Syntax: referer_hash_bucket_size size;
- Default: referer_hash_bucket_size 64;
- Context: server, location
- Syntax: referer_hash_max_size size;
- Default: referer_hash_max_size 2048;
- Context: server, location
- valid_referers
- referer_hash_bucket_size
- referer_hash_max_size
这里面最重要的是 valid_referers
指令,需要重点来说明一下。
可以同时携带多个参数,表示多个 referer 头部都生效。
none
下面来看一个配置文件。
- server {
- server_name referer.ziyang.com;
- listen 80;
- error_log logs/myerror.log debug;
- root html;
- location /{
- valid_referers none blocked server_names
- *.ziyang.com www.ziyang.org.cn/nginx/
- ~\.google\.;
- if ($invalid_referer) {
- return 403;
- }
- return 200 'valid\n';
- }
- }
那么对于这个配置文件而言,以下哪些请求会被拒绝呢?
- curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/
- curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/
- curl -H 'referer: ' referer.ziyang.com/
- curl referer.ziyang.com/
- curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/
- curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/
- curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/
- curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/
我们需要先来解析一下这个配置文件。 valid_referers
指令配置了哪些值呢?
- valid_referers none blocked server_names
- *.ziyang.com www.ziyang.org.cn/nginx/
- ~\.google\.;
下面就实际看下响应:
- # 返回 403,没有匹配到任何规则
- ~ curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/
403 Forbidden 403 Forbidden
nginx/1.17.8 - ~ curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/
403 Forbidden 403 Forbidden
nginx/1.17.8 - # 匹配到了 *.ziyang.com
- ~ curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/
- valid
- ~ curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/
- valid
- # 匹配到了 server name
- ~ curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/
- valid
- # 匹配到了 blocked
- ~ curl -H 'referer: ' referer.ziyang.com/
- valid
- # 匹配到了 none
- ~ curl referer.ziyang.com/
- valid
- # 匹配到了 ~\.google\.
- ~ curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/
- valid
referer 模块是一种简单的防盗链手段,必须依赖浏览器发起请求才会有效,如果攻击者伪造 referer 头部的话,这种方式就失效了。
secure_link 模块是另外一种解决的方案。
它的主要原理是,通过验证 URL 中哈希值的方式防盗链。
基本过程是这个样子的:
原理如下:
原始字符串通常由以下部分有序组成:
模块:
ngx_http_secure_link_module
变量
- Syntax: secure_link expression;
- Default: —
- Context: http, server, location
- Syntax: secure_link_md5 expression;
- Default: —
- Context: http, server, location
- Syntax: secure_link_secret word;
- Default: —
- Context: location
secure_link
secure_link_expires
- echo -n '时间戳URL客户端IP密钥' | openssl md5 -binary | openssl base64 | tr +/ - | tr -d =
- /test1.txt?md5=md5生成值&expires=时间戳(如 2147483647)
secure_link $arg_md5,$arg_expires;
secure_link_md5 \"$secure_link_expires$uri$remote_addr secret";
下面是一个实际的配置文件,我这里就不做演示了,感兴趣的可以自己做下实验。
- server {
- server_name securelink.ziyang.com;
- listen 80;
- error_log logs/myerror.log info;
- default_type text/plain;
- location /{
- secure_link $arg_md5,$arg_expires;
- secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
- if ($secure_link = "") {
- return 403;
- }
- if ($secure_link = "0") {
- return 410;
- }
- return 200 '$secure_link:$secure_link_expires\n';
- }
- location /p/ {
- secure_link_secret mysecret2;
- if ($secure_link = "") {
- return 403;
- }
- rewrite ^ /secure/$secure_link;
- }
- location /secure/ {
- alias html/;
- internal;
- }
- }
除了上面这种相对复杂的方式防盗链,还有一种相对简单的防盗链方式,就是只对 URI 进行哈希,这样当 URI 传
- secure_link_secret secret;
原请求
生成的安全请求
生成 md5
echo -n 'linksecret' | openssl md5 –hex
secure_link_secret secret;
这个防盗链的方法比较简单,那么具体是怎么用呢?大家都在网上下载过资源对吧,不管是电子书还是软件,很多网站你点击下载的时候往往会弹出另外一个页面去下载,这个新的页面其实就是请求的 Nginx 生成的安全 URL。如果这个 URL 被拿到的话,其实还是可以用的,所以需要经常的更新密钥来确保 URL 不会被盗用。
今天这篇文章详细讲了防盗链的具体用法,最近的这两篇文章都是说的已有的变量用法,下一篇文章讲一下怎么生成新的变量。
分享标题:听说你的资源被盗用了,那你知道Nginx怎么防盗链吗?
地址分享:http://www.mswzjz.cn/qtweb/news49/30399.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能