简单有效的防盗链手段:referer模块(从浏览器中发起的请求)
默认编译进nginx,通过--without-http_referer_module禁用
目的:拒绝非正常网站访问我们站点资源
场景:某网站通过url引用了你的页面,当用户在浏览器上点击url时,http请求的头部中会通过refer而头部,将该网站当前页面的url带上,告诉服务器本地请求是由这个页面发起的
思路:通过referer模块,用invalid_referer变量根据配置判断referer头部是否合法
invalid_referer变量:允许访问时,变量值为空。不允许访问时变量值为1
1.valid_referers指令(可同时携带多个参数,表示多个referer头部都生效)
语法:valid_referers none | blocked | server_names | string ...;
默认:空
放置位置:server,location
参数值解析:
none:允许缺失referer头部的请求访问
block:允许referer头部没有对应的值的请求访问
server_names:若referer中站点域名与Server_name中本机域名某个匹配,则允许该请求访问
表示域名及URL的字符串,对域名可在前缀或者后缀中含有*通配符,若referer头部的值匹配字符串后,则允许访问
正则表达式,若referer头部的值匹配正则表达式后,则允许访问
2.referer_hash_bucket_size指令
语法:referer_hash_bukcet_size size;
默认:referer_hash_bukcet_size 64;
放置位置:server,location
3.referer_hash_max_size指令
语法:referer_hash_max_size size;
默认:referer_hash_max_size 2048;
放置位置:server,location
另一种解决方案:secure_link模块(攻击者伪造referer头部 )
过程:由某服务器生成加密后的安全连接url,返回个客户端。客户端使用安全url访问nginx,由nginx的secure_link变量判断是否验证通过
原理:
(1)哈希算法是不可逆的
(2)客户端只能拿到执行过哈希算法的URL
(3)仅生成URL的服务器,验证URL是否安全的nginx这二者,才保存执行哈希算法前的原始字符串
(4)原始字符串通常由以下部分有序组成
①资源位置:例如HTTP中指定资源的URI,防止攻击者拿到一个安全URL后可以访问任意资源
②用户信息:例如用户IP地址,限制其他用户盗用安全URL
③时间戳:使安全URL及时过期
④密钥:仅服务器端拥有,增加攻击者猜测出原始字符串的难度
ngx_http_secure_link_module模块:默认未编译进nginx,需要通过--with-http_secure_link_module添加
常用变量:secure_link,secure_link_expires
1.secure_link指令
语法:secure_link expression; (值为空:验证不通过。值为0:URL过期。值为1:验证通过)
默认:空
放置位置:http,server,location
2.secure_link_md5指令
语法:secure_link_md5 expression;(时间戳的值)
默认:空
放置位置:http,server,location
nginx中配置
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr secret";(构造原始字符串的顺序)
3.secure_link_secret指令
语法:secure_link_secret word;
默认:空
放置位置:location
nginx配置:
secure_link_secret secret;