2009-09-12 38 views
9

Tôi đang sử dụng TinyMCE trình chỉnh sửa cho văn bản được nộp trong các mẫu Django.Sử dụng bộ lọc an toàn ở Django cho các trường văn bản có định dạng

Bây giờ, để hiển thị văn bản có định dạng lại cho người dùng, tôi buộc phải sử dụng bộ lọc "an toàn" trong các mẫu Django để văn bản HTML phong phú có thể được hiển thị trên trình duyệt.

Giả sử JavaScript bị tắt trên trình duyệt của người dùng, TinyMCE sẽ không tải và người dùng có thể vượt qua <script> hoặc các thẻ XSS khác từ trường văn bản như vậy. HTML như vậy sẽ không an toàn để hiển thị lại cho Người dùng.

Làm cách nào để quản lý Văn bản HTML không an toàn không đến từ TinyMCE?

Trả lời

10

Bạn có quyền quan tâm về HTML thô, nhưng không phải chỉ dành cho các trình duyệt bị tắt Javascript. Khi xem xét tính bảo mật của máy chủ, bạn phải bỏ qua bất kỳ công việc nào được thực hiện trong trình duyệt và chỉ xem xét những gì máy chủ chấp nhận và điều gì xảy ra với máy chủ đó. Máy chủ của bạn chấp nhận HTML và hiển thị nó trên trang. Điều này là không an toàn.

Thực tế là TinyMce trích dẫn HTML là một bảo mật giả: máy chủ tin tưởng vào những gì nó chấp nhận, mà nó không nên.

Giải pháp cho điều này là xử lý HTML khi nó đến, để xóa các cấu trúc nguy hiểm. Đây là một vấn đề phức tạp để giải quyết. Hãy xem XSS Cheat Sheet để xem nhiều loại đầu vào có thể gây ra sự cố.

lxml có chức năng làm sạch HTML: http://lxml.de/lxmlhtml.html#cleaning-up-html, nhưng tôi chưa bao giờ sử dụng nó, vì vậy tôi không thể đảm bảo chất lượng của nó.

+1

Bảng gian lận XSS là một ví dụ tốt về lý do tại sao thực hiện các quy trình dọn dẹp HTML là một quá trình khá vô ích. Thẻ html trong danh sách trắng thực sự là cách duy nhất để tránh hoàn toàn điều đó. –

+0

+1 cho liên kết tuyệt vời.Tôi nghĩ rằng các ứng dụng trong tương lai của tôi sẽ có ít lỗ hổng hơn cho việc này. Cảm ơn bạn. –

3

Không có câu trả lời hay cho câu trả lời này. TinyMCE tạo HTML và tính năng tự động thoát của django đặc biệt loại bỏ HTML.

Giải pháp truyền thống cho vấn đề này là sử dụng một số ngôn ngữ đánh dấu không phải html ở phía đầu vào của người dùng (bbcode, markdown, v.v.) hoặc để đưa vào danh sách trắng các thẻ HTML. TinyMCE/HTML nói chung chỉ là giải pháp đầu vào thích hợp cho nhiều người dùng ít tin cậy hơn.

Cách tiếp cận danh sách trắng rất khó thực hiện mà không có bất kỳ lỗ hổng bảo mật nào. Một điều bạn không muốn làm là cố gắng chỉ phát hiện các thẻ "xấu" - bạn S miss bỏ lỡ các trường hợp cạnh.

7

Bạn có thể sử dụng bộ lọc mẫu "removetags" và chỉ cần xóa 'tập lệnh'.

+4

'{{value | removetags:" "| safe}}' hoạt động này hoàn hảo. – Glycerine

+4

Xin đừng làm điều này. Có nhiều cách để kẻ tấn công tiêm javascript bên cạnh việc sử dụng thẻ '

Các vấn đề liên quan