2013-06-26 26 views
6

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à;

  1. 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.)

  2. 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ậy htmlspecialchars() 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>.

  3. 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.

+0

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

+0

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 –

Trả lời

2

Bạn có thể sử dụng hệ thống thẻ tương tự như BBCode hoặc Markdown để cho phép người dùng của bạn thực hiện một số thao tác nhất định. Bằng cách này, bạn có thể chắc chắn rằng đầu vào sẽ được vệ sinh chống lại MỌI loại tập lệnh độc hại, chỉ cần sử dụng lexer và bảo vệ XSS khi hiển thị nội dung người dùng.

EDIT: Để xem những gì tôi có nghĩa là, bạn có thể sử dụng ckeditor như trình soạn thảo WYSIWYG của bạn, kết hợp với các BBCode plugin:

+0

Được rồi, điều này thật tuyệt vời. Một biên tập viên đăng một BBCode và cũng cung cấp WYSIWYG cùng một lúc? Đúng rồi. Cảm ơn rất nhiều. Sẽ bao gồm nó trên các dự án của tôi từ bây giờ! Giải pháp này là những gì tôi đang tìm kiếm. – Aristona

-1

Tôi không biết điều này khả thi như thế nào cho bạn, nhưng một giải pháp nhanh chóng và dễ dàng là sử dụng các cookie httpOnly. Nó giải quyết các cuộc tấn công XSS thông qua tiêm javascript độc hại như những cookie không thể truy cập javascript.You có thể cố gắng để đưa dữ liệu senstive trong httpOnly cookie và dữ liệu không quá nhạy cảm trong cookie bình thường. Xem phần này: http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

+0

Tôi không quan tâm đến cookie. Javascript phải được tắt hoàn toàn. – Aristona

1

Bạn có thể chạy mọi thứ thông qua strip_tags và chỉ cho phép các thẻ tối thiểu có thể không?

Bạn cũng có thể muốn xem xét html purifier mà nên cung cấp cho bạn nhiều tùy chọn bao gồm kiểm soát css

Những gì tôi thường làm là tiết kiệm hai bản sao của nội dung WYSIWYG:

  1. bản gốc nội dung không lọc
  2. nội dung được lọc

Điều này cho phép tôi xử lý lại nội dung gốc nếu tôi thấy nội dung nào đó vi tal đã bị loại bỏ và hiển thị cho người dùng html gốc của họ khi chỉnh sửa.Rõ ràng là tôi hiển thị nội dung được lọc bất cứ nơi nào nó được hiển thị trên trang web.

0

sử dụng Laravel bạn cũng có thể phải khử trùng cho lưỡi mẫu thứ. Bạn không muốn người dùng nhập nội dung như: {{{phpInfo()}}}.

Xây dựng trình chỉnh sửa WYSIWYG yêu cầu người dùng phải có mức độ tin cậy. Nếu bạn không tin tưởng người dùng ở tất cả các lựa chọn tốt nhất của bạn là những gì được đề cập trước đó bằng cách sử dụng thẻ tùy chỉnh.