Gzip 炸彈英文名為 Gzip bomb,是一種古老的被動防御手段。它的原理是當(dāng)爬蟲訪問服務(wù)器網(wǎng)頁資源時摻入一些高壓縮比的壓縮文件。如果爬蟲自帶解壓縮功能(比如 Python requests 庫)就會觸發(fā)壓縮炸彈,直接導(dǎo)致爬蟲的客戶端內(nèi)存被撐爆。
以下是制作 Gzip 炸彈的命令:
dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip
PHP 版的服務(wù)端 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 庫爬取網(wǎng)頁資源,在使用 requests 庫時如何避免被 gzip 炸彈攻擊?
為了避免被 Gzip 炸彈攻擊,在使用Python的 requests 庫時,可以設(shè)置stream 參數(shù)為 True。這將使得響應(yīng)內(nèi)容不會被自動解壓縮,而是在使用時才進行解壓縮,從而可以限制解壓縮的大小。
示例代碼:
import requests
url = 'http://example.com/some_large_file.gz'
# 設(shè)置 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:
# 如果解壓縮后的數(shù)據(jù)大小超過了限制,則拋出異常
raise Exception("Response too large, possible gzip bomb attack.")
這樣做可以確保請求不會在解壓縮時耗盡系統(tǒng)資源,從而防止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
《幾行代碼直接炸了爬蟲服務(wù)器》 作者kingname
https://mp.weixin.qq.com/s/Lzo6Pm09XsOqPkz3O91Mgg
《哈哈,有人爬我網(wǎng)站,我把他教育了一頓!》 程序員魚皮
https://mp.weixin.qq.com/s/OX4fwC9Oe3R6cHYoyXpskA
該文章在 2024/3/9 16:03:49 編輯過