Trong bối cảnh các trình thu thập dữ liệu web (web crawler) trở nên hung hãn hơn để phục vụ đào tạo mô hình ngôn ngữ lớn (LLM), nhiều trang web đã phải đối mặt với tình trạng tài nguyên bị khai thác cạn kiệt. Mặc dù trang cá nhân của tôi chưa bị ảnh hưởng nghiêm trọng, nhưng tôi luôn tìm kiếm giải pháp để đối phó. Hôm nay, tôi chia sẻ một phương pháp độc đáo: bom nén HTML hợp lệ sử dụng gzip và brotli.
Mục lục
Vấn Đề Với Trình Thu Thập Dữ Liệu LLM
Các bot thu thập dữ liệu phục vụ LLM thường bỏ qua quy tắc trong tệp robots.txt
. Ban đầu, chặn IP có vẻ là giải pháp khả thi, nhưng những bot này đã tìm cách vượt qua bằng cách sử dụng mạng botnet với hàng loạt địa chỉ IP riêng lẻ.
Giải pháp thay thế là làm cạn kiệt tài nguyên của chúng. Bom nén (zip bomb) chính là vũ khí lợi hại nhằm chiếm dụng RAM của các trình thu thập này. Chúng ta tận dụng sự chênh lệch giữa tài nguyên cần thiết để phân phối bom nén so với yêu cầu xử lý của bot.
Xây Dựng Bom Nén HTML Hợp Lệ
Bom nén gzip cơ bản thường chứa dữ liệu lặp (ví dụ: chuỗi ký tự 0). Tuy nhiên, trình duyệt dễ dàng phát hiện những tập tin không phải HTML hợp lệ. Thách thức ở đây là tạo trang HTML chứa bom nén mà vẫn tuân thủ chuẩn định dạng.
Sau nhiều thử nghiệm, tôi chọn giải pháp sử dụng comment HTML để nhúng dữ liệu nén. Đoạn script Fish sau tạo trang HTML chứa comment dài 10MB:
#!/bin/fish<br>
# Tạo phần đầu HTML<br>
echo -n '<!DOCTYPE html><html lang=en><head><meta charset=utf-8><title>Bom HTML</title><!--'<br>
<br>
# Tạo nội dung comment<br>
echo -n (string repeat --count 258 'H') >/tmp/H_258<br>
for i in (seq 507)<br>
cat (yes /tmp/H_258 | head --lines=81925)<br>
end<br>
cat (yes /tmp/H_258 | head --lines=81924)<br>
<br>
# Kết thúc HTML<br>
echo -n "--><body><p>Đây là bom HTML hợp lệ</p></body>"
Sau khi nén bằng gzip -9, tập tin chỉ còn ~10KB nhưng giải nén sẽ tạo ra 10GB dữ liệu – đạt tỷ lệ nén ấn tượng 1:1030.
Cấu Hình Nginx Phân Phối Bom Nén
Để tối ưu, tôi sử dụng module ngx_http_gzip_static_module
của Nginx nhằm phục vụ trực tiếp tập tin đã nén sẵn:
location = /bomb.html {<br>
gzip_static on;<br>
gzip_proxied expired no-cache no-store private auth;<br>
brotli_static on; # Hỗ trợ cả brotli<br>
}
Kiểm tra hoạt động bằng lệnh curl cho thấy máy chủ trả về đúng định dạng nén với dung lượng đúng yêu cầu.
Kết Quả Thử Nghiệm
- Firefox: Bị treo và báo lỗi NS_ERROR_OUT_OF_MEMORY
- Chrome: Dừng đột ngột với thông báo SIGKILL
- Selenium: Chắc chắn sẽ gặp sự cố khi xử lý trang
Lưu ý quan trọng: Luôn thêm Disallow: /bomb.html
vào tệp robots.txt để tránh ảnh hưởng đến trình thu thập hợp pháp.
Cải Tiến Trong Tương Lai
Phương pháp sử dụng comment HTML tuy hiệu quả nhưng chưa tối ưu. Bom nén có thể được cải tiến bằng cách:
- Sử dụng những phần tử HTML khác để chứa dữ liệu nén
- Đa dạng hóa dữ liệu nén (không chỉ chuỗi ‘H’ lặp lại)
- Tận dụng tối đa tỷ lệ nén của brotli (thường cao hơn gzip)
Giải pháp này không chỉ giúp bảo vệ tài nguyên máy chủ mà còn là cách thức thú vị để nghiên cứu về khả năng chịu tải của trình thu thập dữ liệu.