Python requests 如何避免被 Gzip 炸弹攻击

admin 2024年3月9日07:53:18评论9 views字数 1468阅读4分53秒阅读模式

Gzip 炸弹英文名为 Gzip bomb,是一种古老的被动防御手段。它的原理是当爬虫访问服务器网页资源时掺入一些高压缩比的压缩文件。如果爬虫自带解压缩功能(比如 Python requests 库)就会触发压缩炸弹,直接导致爬虫的客户端内存被撑爆。

以下是制作 Gzip 炸弹的命令:

dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip

PHP 版的服务端 Gzip bomb 例子;

Python requests 如何避免被 Gzip 炸弹攻击

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 MBdecompressed_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
《几行代码直接炸了爬虫服务器》 作者kingnamehttps://mp.weixin.qq.com/s/Lzo6Pm09XsOqPkz3O91Mgg
《哈哈,有人爬我网站,我把他教育了一顿!》 程序员鱼皮https://mp.weixin.qq.com/s/OX4fwC9Oe3R6cHYoyXpskA


全文完。

如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

原文始发于微信公众号(生有可恋):Python requests 如何避免被 Gzip 炸弹攻击

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月9日07:53:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python requests 如何避免被 Gzip 炸弹攻击http://cn-sec.com/archives/2561788.html

发表评论

匿名网友 填写信息