2010-05-24 46 views
6

Tôi đang xử lý một đầu vào người dùng từ nào với một trình soạn thảo WYSIWYG javascript và tôi đang lập kế hoạch về việc sử dụng HTMLPurifier để làm sạch văn bản.sử dụng HTMLPurifier cho đầu vào hoặc đầu ra thoát/lọc

Tôi nghĩ rằng nó sẽ là đủ để sử dụng HTMLPurifier trên đầu vào, lưu trữ đầu vào làm sạch trong cơ sở dữ liệu, và sau đó đầu ra nó mà không có thêm thoát/lọc. Nhưng tôi đã nghe ý kiến ​​khác rằng bạn nên luôn luôn thoát khỏi đầu ra.

Ai đó có thể giải thích tại sao tôi cần phải làm sạch đầu ra nếu tôi đã làm sạch đầu vào?

Trả lời

4

tôi giả soạn thảo WYSIWYG của bạn tạo ra HTML, sau đó được xác nhận và đưa vào cơ sở dữ liệu. Trong trường hợp đó, việc xác thực đã diễn ra, do đó không cần phải xác thực hai lần.

Đối với "đầu ra thoát", đó là vấn đề khác. Bạn không thể thoát khỏi HTML kết quả, nếu không bạn sẽ không có văn bản được định dạng và các thẻ sẽ hiển thị. Thoát đầu ra được sử dụng khi bạn không muốn đầu ra nói để can thiệp vào việc đánh dấu trang.

Tôi muốn thêm bạn phải rất cẩn thận với những gì bạn cho phép trong giai đoạn xác thực của mình. Có thể bạn sẽ chỉ muốn cho phép một vài thẻ HTML và thuộc tính.

+0

Vấn đề với việc dựa vào trình soạn thảo js là một người dùng độc hại có thể gửi một bài đăng bỏ qua bất cứ điều gì kiểm tra các js có. – Yehosef

+0

@user tất nhiên. Nhưng không phải máy lọc của bạn cho mục đích đó? –

+0

@Col - vâng - nhưng Artefacto đã nói rằng js "đã xác thực" html - vì vậy không cần xác thực hai lần (nghĩa là sử dụng htmlpurifier) ​​ – Yehosef

1

Mật khẩu luôn luôn thoát khỏi đầu ra của bạn, đây là một chuyển đổi văn bản thành HTML, là một mặc định tốt và hợp lý để quay trở lại khi làm việc trong không gian web. Trong trường hợp của Trình lọc HTML, bạn đặc biệt phá vỡ lời khuyên tốt này, bởi vì bạn thực sự thực hiện chuyển đổi HTML sang HTML và xử lý HTML dưới dạng Văn bản một lần nữa không thực sự có ý nghĩa.

+0

cảm ơn câu trả lời nhưng tôi không thực sự theo dõi - bạn có nói rằng khi sử dụng htmlpurifier, nó có thể được coi là an toàn không? – Yehosef

+1

Tôi nghĩ nó phụ thuộc vào ngữ cảnh. Nếu bạn cho phép người dùng viết một bài đăng blog, bạn sử dụng HTMLPurifier để quyết định thẻ nào được phép sử dụng. Sau khi thực hiện xong, bạn cần đầu ra HTML đó dưới dạng HTML. Bạn không muốn coi nó là văn bản thoát ra, nếu không, nếu người dùng in đậm một từ, nó sẽ được thoát và hiển thị là từ. Có lẽ Edward sẽ quay lại để xác nhận bình luận của tôi. – joedevon

2

Để an toàn 100%, hãy sử dụng HTMLPurifier hai lần. Trước khi lưu HTML vào DB và trước khi xuất nó ra màn hình.
Hạn chế lớn của giải pháp như vậy là hiệu suất. HTMLPurifier là ultraslow khi lọc HTML và bạn có thể gặp phải thời gian xử lý lâu hơn của các trang của bạn.

Bạn nên ok nếu bạn chỉ thực hiện 1-2 lần lọc trước khi xuất một thứ gì đó để sàng lọc, nhưng nếu bạn lọc 10 lần cho mỗi yêu cầu như chúng tôi đã làm, chúng tôi quyết định không sử dụng HTMLPurifier khi xuất ra một lượng lớn văn bản.

HTMLPurifier mất 60% thời gian chế biến theo yêu cầu và chúng tôi muốn đạt được thời gian đáp ứng thấp và cao UX để thay thế.

Điều đó phụ thuộc vào hoàn cảnh của bạn. Nếu bạn có thể đủ khả năng sử dụng HTMLPurifier trước khi xuất, hãy tìm nó - nó tốt hơn và bạn luôn có quyền kiểm soát những thẻ bạn muốn cho phép (cho mới và ngay cả đối với nội dung cũ được lưu trữ trong db của bạn).

+1

Cảm ơn bài đăng của bạn - nhưng bạn có thể giải thích một trường hợp mà tôi cần phải làm hai lần không? ví dụ: nếu tôi làm: $ id = (int) $ _ POST ['id']; $ db-> truy vấn ("chọn * từ người dùng trong đó id =" .int_val ($ id)); tôi có nhận được bất kỳ thứ gì về bảo mật không? – Yehosef

+1

Bộ lọc thứ hai (trước khi xuất) rất hữu ích trong trường hợp ai đó đã tấn công vào máy chủ db của bạn nhưng không quản lý đột nhập vào máy chủ web của bạn. Kẻ tấn công có thể dễ dàng thay đổi bất kỳ nội dung nào trong db của bạn và nếu bạn không lọc HTML trước khi xuất, bạn có vấn đề bảo mật khá nghiêm trọng. Tuy nhiên tôi tin rằng đây là một tình huống rất hiếm. –

+1

đây là kịch bản ridiculuos tôi muốn nói –

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