2011-07-10 75 views
6

Tôi đang xss chống trang web của tôi cho các cuộc tấn công javascript và xss. Nó được viết bằng ASP.NET Webforms.Ngăn chặn các cuộc tấn công Javascript và XSS

Phần chính tôi muốn kiểm tra là điều khiển người dùng có hộp văn bản (tinyMCE được đính kèm với nó).

Người dùng có thể gửi câu chuyện cho trang web bằng cách viết trong hộp văn bản này. Tôi phải đặt validateRequest thành sai vì tôi muốn nhận câu chuyện của người dùng trong HMTL (tinyMCE).

Tôi nên ngăn chặn các cuộc tấn công javascript-xss như thế nào? Vì câu chuyện của người dùng là văn bản HMTL, tôi không thể sử dụng Server.HtmlEncode về câu chuyện của họ. Nói chung, cách an toàn để nhận nội dung HTML từ người dùng, lưu và sau đó hiển thị nội dung đó cho người dùng là gì?

Nếu một người dùng đặt mã độc vào hộp văn bản và gửi nó, có khả năng điều này có thể gây hại cho những người khác xem văn bản đó không?
Cảm ơn.

+2

câu hỏi hay. tôi không nghĩ rằng một câu trả lời sẽ làm biện minh cho câu hỏi. trên một mặt không liên quan lưu ý captcha của bạn là lỗi thời (cập nhật hơn hai năm trước đây). hãy thử [recaptcha] của google (http://www.google.com/recaptcha). – naveen

+0

Nó sẽ không làm tổn thương cũng ngăn chặn các cuộc tấn công SQL Injection. – Tim

+1

@Tim: Được chăm sóc bởi EF – Kamyar

Trả lời

4

Nếu bạn không xóa nội dung người dùng đặt vào hộp văn bản và gửi, thì có, có khả năng gây hại.

Bạn có thể muốn xem Microsoft Anti-Cross Site Scripting Library, vì nó được thiết kế để giúp các nhà phát triển ngăn chặn các cuộc tấn công như vậy.

Cũng đáng tham gia một cái nhìn tại là OWASP của Cross-site Scripting (XSS)

Bạn có thể muốn nhìn vào HttpUtility.HtmlEncode và HttpUtility.HtmlDecode là tốt. Tôi chỉ viết một bài kiểm tra nhanh chóng, và có vẻ như nó có thể giải quyết mối quan tâm của bạn trong các bình luận bên dưới (về cách hiển thị dữ liệu cho người dùng khác trong các định dạng bên phải):

string htmlString = "<b>This is a test string</b><script>alert(\"alert!\")</script> and some other text with markup <ol><li>1234235</li></ol>"; 

string encodedString = HttpUtility.HtmlEncode(htmlString); 
// result = &lt;b&gt;This is a test string&lt;/b&gt;&lt;script&gt;alert(&quot;alert!&quot;)&lt;/script&gt; and some other text with markup &lt;ol&gt;&lt;li&gt;1234235&lt;/li&gt;&lt;/ol&gt; 

string decodedString = HttpUtility.HtmlDecode(encodedString); 
// result = <b>This is a test string</b><script>alert("alert!")</script> and some other text with markup <ol><li>1234235</li></ol> 

ASP.NET Controls và HTMLEncode Tôi sẽ đăng thông tin tôi có từ lớp, nhưng tôi tìm thấy một liên kết liệt kê chính xác điều tương tự (cho 1.1 và 2.0), vì vậy tôi sẽ đăng liên kết để tham khảo dễ dàng hơn. Bạn có thể có thêm thông tin về một điều khiển cụ thể không được liệt kê (hoặc phiên bản 3.0/3.5/4.0 nếu họ đã thay đổi) bằng cách tìm trên MSDN, nhưng điều này sẽ phục vụ như một hướng dẫn bắt đầu nhanh cho bạn, ít nhất. Hãy cho tôi biết nếu bạn cần thêm thông tin và tôi sẽ xem những gì tôi có thể tìm thấy.

ASP.NET Controls Default HTML Encoding

Dưới đây là một danh sách toàn diện hơn từ một trong những blog MSDN: Which ASP.NET Controls Automatically Encodes?

+0

Cảm ơn. Nhưng sau đó làm thế nào tôi có thể hiển thị dữ liệu cho người dùng khác ở định dạng đúng? Trên thực tế, việc đặt validateRequest thành false đã làm tôi lo lắng một chút! – Kamyar

+3

Đặt validateRequest thành false cho trang *** sẽ *** lo lắng nếu bạn không thực hiện bất kỳ xác thực nào khác :) Bạn sẽ cần phải xem xét các phương thức mã hóa/giải mã có sẵn trong .NET. Tôi chắc chắn 99% có một cách để làm điều đó, nhưng tôi sẽ phải kiểm tra một số tài liệu và họ đang làm việc. – Tim

+0

Cảm ơn. Tôi rất vui nếu bạn cập nhật câu trả lời của bạn bất cứ khi nào bạn có thời gian để xem tài liệu của mình. – Kamyar

3

tôi sẽ đi với lưu trữ nó mã hóa trong cơ sở dữ liệu, sau đó khi hiển thị Decode nó và chỉ thay thế < với &lt; nếu bạn nói rằng bạn cần phải bảo tồn những thứ khác.

Theo như tôi biết, nếu bạn thay thế < XSS là không thực sự tốt như bất kỳ mã JS phải bên <script> thẻ để được thực thi và bằng cách thay thế, bạn sẽ có được điều này trong nguồn HTML: &lt;script> và người dùng sẽ thấy <script> trên màn hình vì trình duyệt sẽ phân tích cú pháp đối tượng &lt;.

Điều này cho biết, nếu bạn cho phép người dùng đăng HTML "thô", ví dụ:<b>this section is bolded</b> sau đó bạn sẽ phải tạo ra "danh sách trắng" các thẻ cho phép sau đó tự thay thế &lt; với HTML thích hợp ví dụ:

string[] allowedTags = new string[] { "a", "b", "img" }; 
foreach (allowedTag in allowedTags) 
    output = output.Replace("&lt;" + allowedTag, "<" + allowedTag); 
+1

Hmm. có thể nghe được. thay thế tất cả Kamyar

+0

& # 0060 và & # 000000000000000060 cũng hoạt động .. cách bạn sẽ ngăn chặn điều đó? –

+0

@Mark '& # 0060' giống như '<' - vô hại cho đến khi được giải mã, vì vậy, với cách danh sách trắng vẫn an toàn như tôi có thể nói. –

1

Bạn đã thấy các OWASP guide on this

Cách tốt nhất là nên có một danh sách trắng các thẻ được phép thay vì cố gắng tìm ra cách ngăn chặn tất cả các thẻ tập lệnh.

Một giải pháp về cách thực hiện điều này là ở đây How do I filter all HTML tags except a certain whitelist? Nhưng bạn cũng cần lưu ý rằng mọi người có thể có liên kết đến tập lệnh bên ngoài thông qua thẻ hình ảnh có URL tới máy chủ của riêng họ. Xem ví dụ tại đây http://ha.ckers.org/xss.html các loại tấn công khác nhau mà bạn cần để bảo vệ chống lại

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