安全运维–Nginx配置增强安全性

Nginx利用referer判断禁止静态资源被直接访问

1、Nginx Referer模块

nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求。当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。构造Referer的请求很容易实现,所以使用这个模块并不能100%的阻止这些请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
location /static/ {

valid_referers [domain-name];
if ($invalid_referer) {
return 403;
}

alias {$webroot}/static/;
expires 30d;
autoindex off;
add_header Cache-Control private;

# access_log off;
# log_not_found off;

# try_files $uri $uri/ //index.html;
# django -- static/
}

2、valid_referers 指令

语法: valid_referers none | blocked | server_names | string … ;

该指令后面可以接 none blocked server_names string或者是正则表达式

none 代表没有referer

blocked:请求头Referer字段不为空(即存在Referer),但是值被代理或者防火墙删除了,这些值不以“http://”或“https://”开头,通俗点说就是允许“http://”或”https//“以外的请求。

server_names:Referer请求头白名单。

arbitrary string:任意字符串,定义服务器名称或可选的URI前缀,主机名可以使用*号开头或结尾,Referer字段中的服务器端口将被忽略掉。
regular expression:正则表达式,以“~”开头,在“http://”或”https://“之后的文本匹配

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