Nginx 学习笔记 (5)

反制手段 1: 封锁 IP

禁止特定 IP 段的访问,以遵守特定国家的法令 (譬如锁区、GDPR 等),并阻绝不怀好意的用户。

server {
    ... 
    deny xxx.0.0.0/8;
    deny xxx.xxx.0.0/16;
    deny xxx.xxx.xxx.0/24;
    deny xxx.xxx.xxx.xxx;
    ...
}

反制手段 2: (校验 User-Agent) 屏蔽 Spider

禁止特定 UA 的抓取,有利于减省流量、节约带宽,防止被有心人偷偷采集。第一句 for 搜索引擎,第二句 for 时下流行的爬虫或采集器。这招有点“防君子不防小人”,对方尚可透过伪造 UA 来绕开,不过起码能挡住一批小白。

server {
    ...
    if ($http_user_agent ~* (spider|bot)) { return 403; }
    if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { return 403; }
    ...
}

反制手段 3: (校验 Host) 禁止 IP 直接访问,防止 DNS 恶意解析

Note: 就 HTTP 协议而言,须知请求是由客户端发送的,而请求头的所有字段都是可以被人为修改的,所以手段 2/3/4 都是有其局限性的,镜像跟反镜像、反盗链跟反反盗链……都是一个斗智斗勇的过程,没有办法一劳永逸。

原理见 Nginx 学习笔记 (a2) - $host / $http_host / $server_name 区别

server {
    listen 80 default_server;
    server_name _;

    return 444;
}

反制手段 4: (校验 Referer) 图片反盗链

解说一下此处出现的正则表达式 (Regular Expression, 更多语法规则见)——
~* 不分大小写,\. 转义且匹配字符 '.',| “或”的意思,$ 指代行尾 (想想快捷键 ⌘→ )。

以下代码的逻辑是:
valid_referers 约定好有效来路 (Referer),个中参数的含义见此,如果 Referer 请求头的值与约定不符,$invalid_referer 变量变为 1,使条件成立,if 语句内的代码块将被执行,服务器返回 403 Forbidden。

location ~* \.(jpg|jpeg|png|gif|tiff|webp)$ {
    ...
    valid_referers none blocked yourdomain.com;
    if ($invalid_referer) { return 403; }
    ...
}

反制手段 5: 始终返回 Gzip 过的内容

稍微增加对方替换的难度。此举会使 Accept-Encoding: '' 失效,Curl 等抓取工具显示乱码。

方法见 Step 3 @ Nginx 学习笔记 (a3) - 令 sub_filter 可替换 Gzip 过的内容


反制手段 6: 访问认证

这是一个简易的鉴权方法,以服务器返回 401 Unauthorized 且设定 WWW-Authenticate 响应头 → 客户端输入账密并送出 Authorization 请求头 → 服务器再验证这一串用户凭据合法与否的方式来完成。应当搭配 HTTPS 以提高安全性。因浏览器会记住密钥,登录后除非关闭浏览器一直有效,缺乏合理的注销手段,故不建议大量使用 (通常应用于内网)。

Login.png

1) 借由 htpasswd 命令可以生成 HTTP 基本认证 (Basic authentication) 所需的密码文件,而该工具是 httpd-tools 的一部分;

yum install httpd-tools

2) 为图简便,此处将密码文件储存在 /usr/local/nginx/conf,假设用户名 admin、密码 password,生产环境中请酌情修改;

cd /usr/local/nginx/conf
htpasswd -bc passwd admin password

3) 接着修改 server.conf。

server {
    ...
    auth_basic 'Confirm password to continue';
    auth_basic_user_file passwd;
    ...
}