对于公网环境的服务来说,安全问题很值得重视,一个公网服务器每天要被无数次的扫描,对于部署在公网的 web 服务来说,可能会被各种奇怪的请求不停的访问。这些奇怪的请求不但占用了宝贵的服务器资源(包括无用的日志,请求资源等),任由这些工具扫描更有可能会有某些漏洞被利用从而造成损失(部署在公网的数据库之类的一定要设置好安全的密码,不然再无用的测试库都有可能被人黑)。
如果是通过 nginx 代理的服务,那么可以处理服务本身进行防御外,nginx 服务器也可以配置非法的请求不进行转发。
创建一个 request_deny.conf
来拦截各种爬虫或者奇奇怪怪的 agent 以及自定义不允许内容的请求,根据实际情况进行精细的拦截。
被拦截通过返回 444 表明服务器没有返回信息给客户端并且关闭了连接(在威慑恶意软件的时候比较有用)。
#禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
return 444;
}
#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Go-http-client|CPython|python-requests|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{
return 444;
}
#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 444;
}
# 禁用post
if ($request_method ~ "POST") {
return 444;
}
# 过滤某些请求
if ($request_uri ~* "/%df") {
return 404;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
在网站相关配置文件中插入代码 include request_deny.conf;
,当然也可以在配置文件中直接定义规则。
location / {
proxy_pass http://xxx.xxx.xxx.xxx;
include request_deny.conf;
#禁止非GET方式
if ($request_method !~ ^(GET)$) {
return 444;
}
}
# 假如网站不支持php可以直接全部禁掉
location ~ [^/]\.php(/|$) {
return 444;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13