Tôi nghĩ rằng một số câu trả lời khác bỏ lỡ vấn đề rõ ràng ...
Bạn đang sử dụng mysql_real_escape_string về nội dung đầu vào (như bạn nên nếu không sử dụng chuẩn bị phát biểu).
Sự cố của bạn là với đầu ra.
Vấn đề hiện tại là bạn đang gọi html_entity_decode. Chỉ stripslashes là tất cả những gì bạn cần để khôi phục lại văn bản gốc. html_entity_decode là những gì đang rối tung lên dấu ngoặc kép của bạn, vv, vì nó đang thay đổi chúng. Bạn thực sự muốn xuất ra html, không chỉ văn bản thuần túy (đó là khi bạn sẽ sử dụng html_entities, v.v.). Bạn đang giải mã một cái gì đó bạn muốn mã hóa.
Nếu bạn chỉ muốn phiên bản văn bản hiển thị, bạn có thể sử dụng các thực thể. Nếu bạn đang lo lắng về thẻ xấu, hãy sử dụng thẻ thoát và chỉ cho phép các thẻ bạn muốn (chẳng hạn như b, i, v.v.).
Cuối cùng, hãy nhớ mã hóa và giải mã theo thứ tự thích hợp. nếu bạn chạy mysql_real_escape_String (htmlentities ($ str)), thì bạn cần chạy html_entity_decode (stripslashes ($ str)). Thứ tự của các hoạt động quan trọng.
CẬP NHẬT: Tôi không nhận ra rằng html_entity_decode cũng loại bỏ các dấu gạch chéo. Nó không được ghi chép rõ ràng trên trang đó, và tôi chưa bao giờ bắt được nó. Tôi vẫn sẽ tự động chạy nó mặc dù, như hầu hết html mà tôi trình bày tôi muốn để lại như là thực thể, và ngay cả khi tôi không, tôi muốn đưa ra quyết định đó bên ngoài lớp db của tôi, trên cơ sở từng trường hợp. Bằng cách đó, tôi biết các dấu gạch chéo đã biến mất.
Dường như áp phích gốc đang chạy htmlentities (hoặc chương trình nhập liệu của anh ấy, như tinymce đang làm việc đó cho anh ấy) và anh ấy muốn chuyển nội dung trở lại nội dung. Vì vậy, html_entity_decode ($ Str) nên là tất cả những gì được yêu cầu.
Nếu người dùng có thể kiểm soát chuỗi $, thì đây là lỗ hổng XSS. – rook