2010-05-05 21 views
6

Tôi đang mã hóa trình thiết kế chiều rộng trình soạn thảo WYSIWYGMode = "on" trên khung nội tuyến. Trình soạn thảo hoạt động tốt và tôi lưu trữ mã như trong cơ sở dữ liệu.Thực tiễn tốt nhất: Làm sạch HTML do người dùng tạo

Trước khi xuất html, tôi cần phải "sạch" với php ở phía máy chủ để tránh các đoạn mã cross-site-scripting và những thứ đáng sợ khác. Có một số loại thực hành tốt nhất về cách làm điều này? Thẻ nào có thể nguy hiểm?

CẬP NHẬT: Đã sửa lỗi, đó là những gì bạn thấy là những gì bạn nhận được. Không có gì mới :)

+0

Nếu bạn quyết tâm tự mình triển khai, bạn nên xem http://ha.ckers.org/xss.html - danh sách các cuộc tấn công đã biết trong các trình duyệt khác nhau. – FalseVinylShrub

+0

Câu hỏi hay - Tôi đã tự hỏi làm thế nào stackoverflow bảo vệ chính nó ... – JDelage

Trả lời

5

Cách tốt nhất là chỉ cho phép những thứ nhất định mà bạn biết không nguy hiểm và xóa/thoát tất cả những thứ còn lại. Xem bài báo Automated Malicious Code Detection and Removal on the Web (OWASP AntiSamy) để thảo luận về điều này (thư viện dành cho Java, nhưng các nguyên tắc áp dụng cho bất kỳ ngôn ngữ nào).

+0

Tôi bắt đầu theo cách đó, nhưng vì tất cả các trình duyệt thực hiện công cụ này khác nhau tôi sẽ nhận được rất nhiều thẻ cho cùng một điều mà tôi cần cho phép. Ví dụ, văn bản in đậm được thực hiện theo ít nhất 3 cách khác nhau. Vì vậy, nó sẽ là một tập hợp lớn của regex. Bạn cũng có thể dán bất kỳ định dạng html nào bạn muốn trong trình chỉnh sửa, như từ một thư html hoặc một thứ gì đó. Và điều đó có vẻ tốt trong trình soạn thảo nhưng sẽ không hoạt động sau khi thoát. – Martin

+1

Đó là lý do tại sao AntiSamy đã đi kèm với một số bộ ví dụ. Có lẽ, cũng có một thư viện PHP (hoặc bạn có thể tạo một thư viện?) Bạn sẽ * không bao giờ * đạt được nó theo cách khác (bằng cách đưa vào danh sách đen): Mọi người đã thử điều này trước đây, đã thất bại - nó đơn giản là không thực tế - ở đó * sẽ * là thứ mà bạn chưa đề cập đến (điều này gây tử vong cho danh sách đen, nhưng không quan trọng quá nhiều khi có danh sách trắng). Lý tưởng nhất, nếu bạn có thể tránh HTML, hãy sử dụng Markdown, vv, theo đề xuất của Hank! –

+1

@Martin you * REALLY * không nên sử dụng regexes cho việc này. Có một lý do [câu trả lời này] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) có (net) 3000 upvotes. –

0

Nếu bạn đã quen thuộc với ASP .NET, chỉ cần thực hiện một Server.htmlencode() để chuyển đổi các ký tự đặc biệt như <> thành "& g t;" "& l t;"

Trong php, bạn có thể sử dụng các hàm htmlspecialchars().

Khi các ký tự đặc biệt được mã hóa, có thể ngăn chặn cross-site-scripting.

+0

Nhưng điều đó vô hiệu hóa html, tôi muốn cho phép html nhưng xóa các thẻ nguy hiểm như iframe và tập lệnh. – Martin

+0

Sau đó, sử dụng đánh dấu được thiết kế đặc biệt cho prupose như bbcode hoặc wikicode và trình chỉnh sửa phù hợp. – symcbean

3

Nếu bạn thực sự muốn cho phép điều này, bạn nên sử dụng cách tiếp cận danh sách trắng.

Cách tiếp cận tốt nhất có thể là không cho phép HTML và sử dụng định dạng đánh dấu đơn giản thay thế; bạn có thể kết xuất trước vào HTML và lưu trữ nó trong cơ sở dữ liệu nếu hiệu suất là một mối quan tâm. Tránh những loại vấn đề là một trong những lý do lớn cho việc sử dụng Markdown, Textile, reStructuredText vv

LƯU Ý: tôi liên kết với GitHub-Flavored Markdown (GFM), không chuẩn Markdown (SM). GFM giải quyết một số vấn đề phổ biến mà người dùng cuối có với SM.

1

Tôi đã xem xét cùng một câu hỏi gần đây với Perl làm ngôn ngữ phía máy chủ.

Trong khi làm như vậy, tôi chạy vào HTML Purifier có thể là những gì bạn muốn. Nhưng rõ ràng là trong PHP và không phải Perl, tôi đã không thực sự thử nghiệm nó. Ngoài ra, trong nghiên cứu của tôi, tôi đi đến kết luận rằng đây là một doanh nghiệp rất phức tạp và xem xét nếu có thể bằng cách sử dụng một ngôn ngữ đánh dấu đơn giản như Markdown, theo đề xuất của Hank Gay.

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