16《Nginx 入门教程》Nginx防盗链配置

admin 2024-12-21 102人围观 ,发现7个评论

百度百科的解释如下:

2.如何防盗链?3.Nginx中防盗链配置3.1refer模块防盗
Syntax:referer_hash_bucket_sizesize;Default:referer_hash_bucket_size64;Context:server,locationSyntax:referer_hash_max_sizesize;Default:referer_hash_max_size2048;Context:server,locationSyntax:valid_referersnone|blocked|server_names|string;Default:—Context:server,location

最重要的是valid_referers指令,它后面可以带上多个参数,表示多个referer头都是有效的。它的参数形式有:

none:允许缺失referer头部的请求访问

blocked:有referer这个字段,但是其值被防火墙或者是代理给删除了

server_names:若referer中的站点域名和server_names中的某个域名匹配,则允许访问

任意字符或者正则表达式

Nginx会通过查看referer字段和valid_referers后面的referer列表进行匹配,如果匹配到了就将内置的变量$invalid_referer值设置为0,否则设置该值为1

这样一个简单的Nginx防盗链配置如下:

location/{valid_referersnoneblocked*./nginxserver_names~\.baidu\.;if($invalid_referer){return403;}return200"valid\n";}
3.2secure_link模块防盗

前面这种简单检查referer头部值的防盗链方法过于脆弱,盗用者很容易通过伪造referer的值轻而易举跳过防盗措施。在Nginx中有一种更为高级的防盗方式,即基于secure_link模块,该模块能够检查请求链接的权限以及是否过期,多用于下载服务器防盗链。这个模块默认未编译进Nginx,需要在源码编译时候使用--with-secure_link_module添加。

该模块的通过验证URL中的哈希值的方式防盗链。它的防盗过程如下:

由服务器或者Nginx生成安全的加密后的URL,返回给客户端;

客户端使用安全的URL访问Nginx,获取图片等资源,由Nginx的secure_link变量判断是否验证通过;

secure_link模块中总共有3个指令,其格式和说明分别如下:

Syntax:secure_linkexpression;Default:—Context:http,server,locationSyntax:secure_link_md5expression;Default:—Context:http,server,locationSyntax:secure_link_secretword;Default:—Context:location

通过配置secure_link,secure_link_md5指令,可实现对链接进行权限以及过期检查判断的功能。

和referer模块中的$invalid_referer变量一样,secure_link模块也是通过内置变量KaTeXparseerror:Expected'EOF',got'判'atposition14:secure_link判̲断验证是否通过。secure_link的值有如下三种情况:

空字符串:验证不通过

0:URL过期

1:验证通过

通常使用这个模块进行URL校验,我们需要考虑的是如何生成合法的URL?另外,需要在Nginx中做怎样的配置才可以校验这个URL?

对于第一个问题,生成合法的URL和指令secure_link_md5有关。例如:

secure_link_md5"$secure_link_expires$uri$remote_addrsecret";代码块1

如果Nginx中secure_link_md5是上述配置,那么生成合法url的命令如下:

空字符串,校验不通过if($secure_link=""){return403;}return200"$remote_addr";root/root/test;}}server{listen8001;location~*.(jpg|png|flv|mp4)${secure_link$arg_md5,$arg_expires;secure_link_md5"$secure_link_expires$uri$remote_addrsecret";时间过期if($secure_link="0"){return410;}访问静态资源的安全URL为:;expires=1580911200

再次到浏览器上访问时候,我就可以看到静态图片了。

此外,我们还可以等到10点之后,测试过期后的结果。在过期之后再用这个URL访问时无法查看图片,而且返回的是410的状态码,这说明Nginx成功检测到这个密钥值已经过期。

5.小结
猜你喜欢
不容错过