2009-07-31 17 views
11

Tôi đang sử dụng Trình lọc HTML để bảo vệ ứng dụng của mình khỏi các cuộc tấn công XSS. Hiện tại tôi đang lọc nội dung từ trình soạn thảo WYSIWYG vì đó là nơi duy nhất mà người dùng được phép sử dụng đánh dấu XHTML.Trình lọc HTML - cần làm gì?

Câu hỏi của tôi là, tôi có nên sử dụng Trình lọc HTML cũng trên tên người dùng và mật khẩu trong hệ thống xác thực đăng nhập hay không. Có khả năng tấn công XSS ở đó không?

Trả lời

13

Bạn nên làm sạch mọi thứ có thể được hiển thị trên trang. Bởi vì với các cuộc tấn công XSS, tin tặc đặt trong các thẻ <script> hoặc các thẻ độc hại khác có thể liên kết đến các trang web khác.

Mật khẩu và email sẽ ổn. Mật khẩu không bao giờ được hiển thị và email phải có trình xác thực của riêng chúng để đảm bảo rằng chúng ở định dạng thích hợp.

Cuối cùng, hãy nhớ đặt htmlentities() vào nội dung.

Oh .. và xem filter_var là tốt. Cách lọc rất đẹp.

+3

1 cho filter_var –

+4

Đối với đầu vào văn bản bình thường, filter_var nên là đủ. Đối với văn bản cho phép các thẻ HTML, bạn nên sử dụng HTMLPurifier. – Nikko

3

Rủi ro XSS tồn tại khi dữ liệu được nhập bởi một người dùng có thể được xem bởi những người dùng khác. Ngay cả khi dữ liệu này hiện không thể xem được, đừng cho rằng cần phải thực hiện điều này.

Theo như tên người dùng và mật khẩu, bạn không bao giờ nên hiển thị mật khẩu hoặc thậm chí lưu trữ mật khẩu dưới dạng có thể được hiển thị (ví dụ: encyrpt nó với sha1()). Đối với tên người dùng, có giới hạn về các ký tự hợp pháp như [A-Za-z0-9_]. Cuối cùng, như câu trả lời khác cho thấy, hãy sử dụng hàm mã hóa thực thể ngôn ngữ html của bạn cho bất kỳ dữ liệu đã nhập nào có thể chứa các ký tự html dành riêng hoặc đặc biệt, ngăn chặn dữ liệu này gây ra lỗi cú pháp khi được hiển thị.

1

Không, tôi sẽ không sử dụng HTMLPurifier trên tên người dùng và mật khẩu trong quá trình xác thực đăng nhập. Trong các ứng dụng của tôi, tôi sử dụng tên người dùng chữ và số và bộ lọc xác thực đầu vào và hiển thị chúng với htmlspecialchars với ENT_QUOTES. Điều này rất hiệu quả và nhanh hơn rất nhiều so với HTMLpurifier. Tôi chưa thấy một cuộc tấn công XSS sử dụng chuỗi ký tự chữ và số. Và BTW HTMLPurifier là vô ích khi lọc nội dung chữ và số anyway vì vậy nếu bạn buộc chuỗi đầu vào thông qua một bộ lọc chữ và số thì không có điểm để hiển thị nó với HTMLpurifier. Khi nói đến mật khẩu, họ không bao giờ nên được hiển thị cho bất cứ ai ở nơi đầu tiên mà loại bỏ khả năng XSS. Và nếu vì lý do nào đó bạn muốn hiển thị mật khẩu thì bạn nên thiết kế ứng dụng của mình theo cách nó chỉ cho phép chủ sở hữu mật khẩu có thể nhìn thấy nó, nếu không bạn sẽ mất nhiều thời gian và XSS là ít nhất lo lắng của bạn!

0

Trình lọc HTML mất HTML làm đầu vào và tạo HTML làm đầu ra. Mục đích của nó là cho phép người dùng nhập html với một số thẻ, thuộc tính và giá trị, trong khi lọc ra những người khác. Điều này sử dụng danh sách trắng để ngăn chặn bất kỳ dữ liệu nào có thể chứa tập lệnh. Vì vậy, điều này rất hữu ích cho một cái gì đó giống như một trình soạn thảo WYSIWYG.

Tên người dùng và mật khẩu mặt khác không phải là HTML. Chúng là văn bản thuần túy, vì vậy trình lọc HTML không phải là một tùy chọn. Việc cố gắng sử dụng Trình lọc HTML ở đây sẽ làm hỏng dữ liệu hoặc cho phép các cuộc tấn công XSS.

Ví dụ, nó cho phép sau qua không thay đổi, mà có thể gây ra các vấn đề XSS khi chèn như một giá trị thuộc tính trong một số yếu tố:

" onclick="javascript:alert()" href=" 

Hoặc nếu ai đó cố gắng sử dụng những biểu tượng đặc biệt trong mật khẩu của họ, và đi vào :

<password 

khi đó mật khẩu của họ sẽ bị trống và dễ đoán hơn nhiều.

Thay vào đó, bạn nên mã hóa văn bản. Mã hóa cần thiết phụ thuộc vào bối cảnh, nhưng bạn có thể sử dụng htmlentities khi xuất ra những giá trị này nếu bạn dính vào quy tắC# 0quy tắC# 1, tại OWASP XSS Prevention Cheat Sheet

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