Nginx反爬虫

Nginx反爬

我使用了python中的requests库爬取自己网址的图片
通过while True 循环爬取导致正常客户端无法访问
在nginx的access.log中看到以下记录

117.170.202.207 - - [03/Feb/2021:10:35:06 +0800] "GET /pics/05.jpg HTTP/1.1" 200 326446 "-" "python-requests/2.24.0" "-"

而一个正常的访问应该是

117.170.202.207 - - [03/Feb/2021:10:32:46 +0800] "GET /img/9.ico HTTP/1.1" 206 1 "http://www.guixueliang.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x6       4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56" "-"

我使用的log的format格式为

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

各个字段的含义

$remote_addr       记录访问网站的客户端地址;
$remote_user       远程客户端用户名称;
$time_local        记录访问时间与时区;
$request          用户的http请求起始行信息;
$status         http状态码,记录请求返回的状态,例如200、404、301等;
$body_bytes_sent   服务器发给客户端的响应body字节数;
$http_referer     记录此次请求是从哪个链接访问呢过来的,可以根据referer进行防盗链设置;
$http_user_agent   记录客户端访问信息,例如:浏览器、手机客户端等;
$http_x_forwarded_for   当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的x_forwarded_for设置;

即在末尾看到的 python-requests/2.24.0 即为python的UA
但通过简单地禁止该UA是无效的, 因为爬虫可以通过headers伪装

Nginx抵御DDOS

Nginx抵御爬虫


在nginx中屏蔽python-requests的UA后, 如果爬虫没有设置headers, 返回如下
403


我的想法是写一个脚本:

监控access.log, 如果同一个IP的访问过多, 直接将其加入nginx黑名单

nginx内置机制防御

nginx中文文档

  • https://www.nginx.cn/doc/index.html
  • http://tengine.taobao.org/nginx_docs/cn/docs/
nginx屏蔽IP
  • https://www.nginx.cn/2487.html

首先我使用nginx自带的防御机制

1. 限定连接数
ngx_http_limit_conn_module 模块
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_limit_conn_module.html


2. 限制请求处理的频率
ngx_http_limit_req_module 模块
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_limit_req_module.html

python攻击脚本

import requests
import threading
headers = {"User-Agent":"...省略"}

url = input("请输入要攻击的ip或者网址(带http/https): ")

strength = int(input("请输入攻击强度[2~16]: "))
def run():
    n = 0
    while True:
        try:
            result = requests.get(url, headers=headers).content
            with open(str(n)+".jpg", "wb") as f:
                f.write(result)
        except Exception:
            pass
        n += 1
        print(n)
print("攻击中...")
for _ in range(strength):
    threading.Thread(target=run).start()

我开启16个线程同时访问我的服务器上的一张照片
战果如下
在这里插入图片描述

在一瞬间下载了数百张jpg格式的文件, 但只有215kb的文件才是真正的图片, 其中1kb的内容如下

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!--用于禁用MSIE和Chrome友好错误页的填充 -->
小结 关于nignx的两个防御模块 limit_conn / limit_req

虽然这两个模块确实帮我抵御住了一些攻击

攻击脚本3秒钟访问次数为247, 有效照片仅为3


关键是我的是学生机, 带宽只有1M, 即下载速度为1024/8=128KB
仍然占满我的带宽
正常客户端仍然无法正常访问

看来还得使用我最初的想法: 封IP

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
nginx是一个高性能的HTTP和向代理服务器,它可以通过配置文件来进行灵活的定制。在nginx中,斜杠主要用于转义特殊字符,以便正确解析和处理请求。 以下是关于nginx斜杠配置的一些详解: 1. 转义符号:在nginx配置文件中,使用斜杠(\)作为转义符号。当需要使用特殊字符时,可以在其前面加上斜杠,以避免对它们的解析错误。 2. 转义特殊字符:在nginx配置文件中,一些特殊字符需要进行转义,以确保它们被正确识别和处理。例如,如果要在一个location块中配置路径包含斜杠(/)字符,可以使用斜杠进行转义,如下所示: ``` location /path\/with\/slashes { ... } ``` 在这个例子中,路径"/path/with/slashes"中的每个斜杠都被斜杠转义。 3. 转义正则表达式:在nginx的rewrite指令中,正则表达式是常见的用法之一。当需要在正则表达式中使用特殊字符时,同样需要进行转义。例如,如果要匹配含有点(.)的URL路径,可以使用斜杠进行转义,如下所示: ``` location / { rewrite ^/path\.html$ /newpath.html; } ``` 在这个例子中,正则表达式中的点(.)被斜杠转义,以确保它只匹配实际的点字符。 4. 转义URL:在nginx配置中,URL也可能需要进行转义。特别是在配置代理服务器时,可能会遇到一些特殊字符,如空格、问号等。使用斜杠对这些字符进行转义,可以确保nginx正确地解析和处理URL。 这些是关于nginx斜杠配置的一些详解,希望对你有所帮助。如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值