Python requests 如何避免被 Gzip 炸弹攻击
|
admin
2024年3月9日 16:3
本文热度 482
|
Gzip 炸弹英文名为 Gzip bomb,是一种古老的被动防御手段。它的原理是当爬虫访问服务器网页资源时掺入一些高压缩比的压缩文件。如果爬虫自带解压缩功能(比如 Python requests 库)就会触发压缩炸弹,直接导致爬虫的客户端内存被撑爆。
以下是制作 Gzip 炸弹的命令:
dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip
PHP 版的服务端 Gzip bomb 例子;
PHP 代码来源链接:
《How to defend your website with ZIP bombs
- the good old methods still work today》
Posted on 2017-07-05
https://blog.haschek.at/2017/how-to-defend-your-website-with-zip-bombs.html
许多爬虫会使用 requests 库爬取网页资源,在使用 requests 库时如何避免被 gzip 炸弹攻击?
为了避免被 Gzip 炸弹攻击,在使用Python的 requests 库时,可以设置stream 参数为 True。这将使得响应内容不会被自动解压缩,而是在使用时才进行解压缩,从而可以限制解压缩的大小。
示例代码:
import requests
url = 'http://example.com/some_large_file.gz'
# 设置 stream=True 来避免自动解压缩
response = requests.get(url, stream=True)
# 手动解压缩并限制解压缩的大小
max_size = 1024 * 1024 * 10 # 限制解压缩的大小为10 MB
decompressed_data = bytearray()
for chunk in response.iter_content(chunk_size=1024):
decompressed_data.extend(chunk)
if len(decompressed_data) > max_size:
# 如果解压缩后的数据大小超过了限制,则抛出异常
raise Exception("Response too large, possible gzip bomb attack.")
这样做可以确保请求不会在解压缩时耗尽系统资源,从而防止Gzip炸弹攻击。
参考:
《How to defend your website with ZIP bombs》
https://blog.haschek.at/2017/how-to-defend-your-website-with-zip-bombs.html
《github flask bomb》
https://github.com/khast3x/flaskbomb?tab=readme-ov-file
《Demo - 20G Payloads>
https://asciinema.org/a/141464
《github gzip-bomb topics》
https://github.com/topics/gzip-bomb
《几行代码直接炸了爬虫服务器》 作者kingname
https://mp.weixin.qq.com/s/Lzo6Pm09XsOqPkz3O91Mgg
《哈哈,有人爬我网站,我把他教育了一顿!》 程序员鱼皮
https://mp.weixin.qq.com/s/OX4fwC9Oe3R6cHYoyXpskA
该文章在 2024/3/9 16:03:49 编辑过