Tôi đang cố gắng để khử trùng và XSS-proof một số đầu vào HTML từ máy khách. Tôi đang sử dụng Python 2.6 với Beautiful Soup. Tôi phân tích đầu vào, loại bỏ tất cả các thẻ và thuộc tính không có trong danh sách trắng và chuyển đổi cây thành chuỗi.Làm thế nào để tạo ra các thực thể HTML đầu ra của Beautiful Soup?
Tuy nhiên ...
>>> unicode(BeautifulSoup('text < text'))
u'text < text'
Đó không giống như HTML hợp lệ đối với tôi. Và với thẻ stripper của tôi, nó sẽ mở đường cho tất cả các loại nastiness:
>>> print BeautifulSoup('<<script></script>script>alert("xss")<<script></script>script>').prettify()
<
<script>
</script>
script>alert("xss")<
<script>
</script>
script>
Các cặp <script></script>
sẽ bị xóa, và những gì còn lại là không chỉ là một cuộc tấn công XSS, nhưng ngay cả HTML hợp lệ là tốt.
Giải pháp hiển nhiên là thay thế tất cả <
ký tự theo <
, sau khi phân tích cú pháp, không được thuộc về thẻ (và tương tự cho >&'"
). Nhưng Beautiful Soup documentation chỉ đề cập đến việc phân tích cú pháp của các thực thể, chứ không đề cập đến việc tạo ra chúng. Tất nhiên tôi có thể chạy một thay thế trên tất cả các nút NavigableString
, nhưng kể từ khi tôi có thể bỏ lỡ một cái gì đó, tôi muốn cho một số mã thử và thử nghiệm làm công việc.
Tại sao Soup đẹp không thoát <
(và các ký tự ma thuật khác) theo mặc định và làm cách nào để tôi làm điều đó?
N.B. Tôi cũng đã xem lxml.html.clean
. Nó dường như làm việc trên cơ sở danh sách đen, không phải danh sách trắng, vì vậy nó không có vẻ rất an toàn với tôi. Thẻ có thể được đưa vào danh sách trắng, nhưng thuộc tính không thể và cho phép quá nhiều thuộc tính cho sở thích của tôi (ví dụ: tabindex
). Ngoài ra, nó cung cấp một số AssertionError
trên đầu vào <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
. Không tốt.
Đề xuất cho các cách khác để làm sạch HTML cũng rất được hoan nghênh. Tôi hầu như không phải là người duy nhất trên thế giới cố gắng làm điều này, nhưng dường như không có giải pháp tiêu chuẩn nào cả.
'văn bản
Gumbo
Ồ, đúng vậy. Dù sao, nó cũng giống với 'text 'mà tôi đã trình bày. –
Thomas