2009-03-31 27 views
11

Tôi đã phát triển một ứng dụng web, cho phép người dùng của tôi quản lý một số khía cạnh của trang web động (có, một số loại cm) trong môi trường LAMP (debian, apache, php, mysql)Tôi làm cách nào để cho phép người dùng chèn mã HTML mà không gặp rủi ro? (không chỉ rủi ro kỹ thuật)

Ví dụ:

Ví dụ: họ tạo tin tức trong khu vực riêng của họ trên máy chủ của tôi, sau đó điều này được xuất bản trên trang web của họ thông qua yêu cầu cURL (hoặc bằng ajax).

Tin tức được tạo bằng trình soạn thảo WYSIWYG (fck tại thời điểm này, có thể là tinyMCE trong tương lai tiếp theo).

Vì vậy, tôi không thể không cho phép các thẻ html, nhưng làm cách nào để tôi có thể an toàn? Loại thẻ nào tôi phải xóa (javascripts?)? Điều đó có nghĩa là an toàn cho máy chủ .. nhưng làm thế nào để được 'hợp pháp' an toàn? Nếu người dùng sử dụng ứng dụng của tôi để tạo xss, tôi có thể gặp một số vấn đề pháp lý không?

Trả lời

15

Nếu bạn đang sử dụng php, một giải pháp tuyệt vời là sử dụng HTMLPurifier.Nó có nhiều tùy chọn để lọc ra những thứ xấu, và như là một tác dụng phụ, đảm bảo đầu ra html cũng được hình thành. Tôi sử dụng nó để xem thư rác có thể là một môi trường thù địch.

+0

Tôi quyết định thực hiện theo cách này, cộng với một số bước cá nhân. Tôi phải cung cấp cho tổng số tự do để costumers của tôi để sử dụng thẻ html ('cos của trình soạn thảo WYSIWYG), hạn chế chỉ những điều nhất định .. tôi hy vọng rằng giữ cho nó cập nhật với các cửa an ninh mới nhất sẽ không có nhiều vấn đề. – Strae

+1

Tôi tin tưởng nó nhiều hơn nữa mà tôi tin tưởng những nỗ lực của riêng tôi .... – DGM

2

Thay vì cho phép HTML, bạn nên có một số đánh dấu khác có thể được chuyển đổi thành HTML. Đang cố gắng để loại bỏ HTML giả mạo từ người dùng nhập vào là gần như không thể, ví dụ

<scr<script>ipt etc="..."> 

Loại bỏ từ này sẽ để lại

<script etc="..."> 
+0

U hát một danh sách trắng thay vì một danh sách đen sẽ giải quyết vấn đề này. – Gumbo

+0

xem câu trả lời thẻ img trong http://stackoverflow.com/questions/701580/how-can-i-allow-my-user-to-insert-html-code-without-risks-not-only-technical-r/701609 # 701609 – cjk

+0

XSS cũng có thể thông qua các ngôn ngữ đánh dấu khác, chẳng hạn như BBcode, do đó không thực sự khắc phục được bất cứ điều gì. Cách tiếp cận danh sách trắng hoạt động khá tốt. – troelskn

6

Chiến lược tốt nhất chung ở đây là danh sách trắng thẻ cụ thể và các thuộc tính mà bạn cho là an toàn và thoát/xóa mọi thứ khác. Ví dụ: danh sách trắng hợp lý có thể là <p>, <ul>, <ol>, <li>, <strong>, <em>, <pre>, <code>, <blockquote>, <cite>. Ngoài ra, hãy xem xét đánh dấu thân thiện với con người như Textile hoặc Markdown có thể dễ dàng chuyển đổi thành HTML an toàn.

+0

Bạn vẫn có thể chèn tập lệnh vào các thẻ được cho phép bằng danh sách trắng không? – jeroen

+0

Điều đó tùy thuộc vào cách bạn thoát khỏi chúng. Nếu bạn mô tả một cái gì đó như " ipt ...", trước tiên tôi sẽ lưu ý rằng "" và nó cũng đã thoát/bị xóa. –

+0

Tôi đã suy nghĩ nhiều hơn về các thuộc tính, nhưng tôi đoán điều đó phụ thuộc nếu danh sách trắng của bạn có bất kỳ thẻ nào cần chúng, vì vậy bạn sẽ phải cho phép chúng. Nếu bạn cho phép các thuộc tính, bạn phải loại bỏ toàn bộ phạm vi onclick = "", vv, nhưng tôi đoán điều đó khá rõ ràng :) – jeroen

11

Nó không thực sự quan trọng những gì bạn đang tìm kiếm để loại bỏ, ai đó sẽ luôn luôn tìm thấy một cách để có được xung quanh nó. Để tham khảo, hãy xem XSS Cheat Sheet này.

Như một ví dụ, làm thế nào bạn đã bao giờ đi để loại bỏ tấn công XSS có giá trị này:

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

lựa chọn tốt nhất của bạn là chỉ cho phép một tập hợp con của các thẻ chấp nhận được và loại bỏ bất cứ điều gì khác. Thực hành này được gọi là White Listing và là phương pháp tốt nhất để ngăn ngừa XSS (ngoài việc không cho phép HTML.)

Cũng sử dụng bảng gian lận trong thử nghiệm của bạn; đốt cháy nhiều nhất có thể tại trang web của bạn và cố gắng tìm một số cách để thực hiện XSS.

+0

+1 cho trang cheat –

0

Nếu quá khó xóa thẻ, bạn có thể từ chối toàn bộ dữ liệu html cho đến khi người dùng nhập một thẻ hợp lệ. Tôi sẽ từ chối html nếu nó chứa các thẻ sau:

frameset, frame, iframe, script, object, embed, applet.

Cũng thẻ mà bạn muốn không cho phép là: đầu (và thẻ phụ), nội dung, html bởi vì bạn muốn cung cấp chúng một mình và bạn không muốn người dùng thao tác siêu dữ liệu của bạn.

Nhưng nói chung, cho phép người dùng cung cấp mã html của riêng mình luôn áp đặt một số vấn đề bảo mật.

0

Bạn có thể muốn xem xét, thay vì cho phép HTML, thực hiện một số standin cho HTML như BBCode hoặc Markdown.

2

Ví dụ về phương pháp tiếp cận danh sách trắng C#, sử dụng stackoverflow, bạn có thể xem this page.

1

Kohana's security helper là khá tốt. Từ những gì tôi nhớ, nó được lấy từ một dự án khác.

Tuy nhiên tôi đã kiểm tra ra

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

Từ LFSR Consulting's answer, và nó đã trốn thoát một cách chính xác.

-1

code that I should have just copy/pasted instead of screenshotting

Nó được chức năng rất tốt trong php bạn có thể sử dụng nó

$string = strip_tags($_POST['comment'], "<b>"); 
+0

Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ [danh tiếng] (https://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bất kỳ bài đăng nào] (https://stackoverflow.com/help/privileges/comment); thay vào đó, [cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-thay thế). - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/18479859) – codechurn

0

tôi sử dụng này strip_tags php chức năng bởi vì tôi muốn người dùng có thể gửi một cách an toàn và tôi cho phép chỉ vài thẻ mà có thể được sử dụng trong bài đăng theo cách này, không ai có thể hack trang web của bạn thông qua việc chèn tập lệnh vì vậy tôi nghĩ strip_tags là lựa chọn tốt nhất

Clich here for code for this php function

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