Tôi có một ứng dụng cấp doanh nghiệp mà người dùng đã đăng nhập được phép đăng bài viết lên trang bằng trình soạn thảo WYSIWYG. (Bạn có thể coi ứng dụng này là người xây dựng trang web.)Làm cách nào để tôi có thể cho phép trình chỉnh sửa WYSIWYG và vô hiệu hóa các cuộc tấn công XSS bằng Laravel?
Mọi thứ đều hoạt động tốt, nhưng vấn đề là;
trình soạn thảo WYSIWYG viết một HTML có chứa bài viết, ký tự chuỗi cũng có một số địa phương mà Laravel không thích, vì vậy
alpha_num
séc Laravel của không thể vượt qua. (Vì vậy chúng tôi không sử dụng nó trên séc xác nhận.)Chúng tôi cần phải cho phép nhân vật như
<
,"
,>
vì họ có thể muốn làm một số phong cách cơ bản sử dụng trình soạn thảo WYSIWYG, vì vậyhtmlspecialchars()
không phải là một lựa chọn trong khi lặp lại/khử trùng các giá trị, bởi vì những thứ có hại như sự phá vỡ của<br>
.Người dùng có thể đăng những thứ như,
<script type="text/javascript>alert('Hello');</script>
hoặc</div></div></div><div style="width: 100%, height: 100% z-index: 999999">
Đó là một rủi ro bảo mật rất lớn, tôi biết, nhưng chúng tôi không thể thực sự khử trùng/thoát khỏi bất kỳ thứ gì. Người dùng sẽ vẫn có thể viết<s<!---->cript>
và vượt qua kiểm tra.
Vì vậy, trong ngắn hạn, chúng tôi không thể dựa vào một số hàm Laravel và PHP tích hợp. Chúng tôi cũng không thể tắt trình soạn thảo WYSIWYG vì nó thường được sử dụng ở hầu hết các vùng trong ứng dụng nói.
Cách tốt nhất để tránh điều này là gì?
Tôi đang nghĩ đến việc tạo quy tắc tùy chỉnh ở trên cùng của alpha_num
trên Laravel, được gọi là alpha_num_localised_characters_plus_allowed_html_tags
và thêm quy tắc đó vào bất kỳ đầu vào nào chứa trình soạn thảo WYSIWYG.
Đây có phải là cách hay không? Có cách nào tốt hơn không? Bạn tự giải quyết các vấn đề như thế nào?
Lưu ý: Xin lưu ý rằng chúng tôi đã phát triển một ứng dụng có kích thước lớn, chúng tôi sẽ dựa vào giải pháp nhanh nhất và dễ bảo trì nhất.
Tôi muốn thêm một chút. Chúng tôi hiện đang chuyển bất kỳ đầu vào nào không được xác nhận bởi Laravel (ví dụ: email | alpha | alpha_dash | custom_validations) để được xác thực bởi HTMLPurifier :: purify(). Hãy cho tôi biết nếu có một cách nhanh hơn! – Aristona
Tôi sẽ không "xác nhận" bằng cách sử dụng htmlpurifier - thay vì sử dụng điều này chỉ để đảm bảo đầu vào là "an toàn". Việc xác nhận duy nhất tôi sẽ làm với laravel là "bắt buộc" nếu trường được yêu cầu. - xem câu trả lời của tôi dưới đây để biết thêm chi tiết –