2009-02-01 28 views
5

Bây giờ tôi gặp phải một số tình huống ngu ngốc. Tôi muốn người dùng có thể sử dụng hàng dệt, nhưng họ không nên rối tung với HTML hợp lệ của tôi xung quanh mục nhập của họ. Vì vậy, tôi phải thoát khỏi HTML bằng cách nào đó.Tôi làm cách nào để dệt và khử trùng html?

  • html_escape(textilize("</body>Foo")) sẽ phá vỡ dệt trong khi

  • textilize(html_escape("</body>Foo")) sẽ làm việc, nhưng phá vỡ tính năng dệt khác nhau như liên kết (bằng văn bản như "Linkname":http://www.wheretogo.com/), kể từ khi có dấu ngoặc kép sẽ được chuyển đổi thành &quot; và do đó không được phát hiện bởi dệt nữa.

  • sanitize không hoạt động tốt hơn.

Bất kỳ đề xuất nào về điều đó? Tôi không muốn sử dụng Tidy cho sự cố này. Cảm ơn trước.

Trả lời

7

Đối với những người gặp vấn đề tương tự: Nếu bạn đang sử dụng đá quý RedCloth, bạn chỉ có thể xác định phương thức của riêng mình (trong một trong những người giúp đỡ).

 
def safe_textilize(s) 
    if s && s.respond_to?(:to_s) 
    doc = RedCloth.new(s.to_s) 
    doc.filter_html = true 
    doc.to_html 
    end 
end 

Trích từ Tài liệu:

Accessors để thiết lập hạn chế bảo mật.

Đây là một điều tuyệt vời nếu bạn sử dụng RedCloth để định dạng trong địa điểm công cộng (ví dụ: Wikis) nơi bạn không muốn người dùng lạm dụng HTML cho những điều xấu.

Nếu filter_html được đặt, HTML không được tạo bởi bộ xử lý Dệt sẽ là được thoát. Ngoài ra, nếu sanitize_html được đặt, HTML có thể vượt qua bộ xử lý dệt nhưng thẻ và thuộc tính trái phép sẽ bị xóa.

+1

Nhưng hãy cẩn thận với việc khai thác thẻ trước và mã. ví dụ. (Tôi có dám mạo hiểm điều này không?)

!!!!mouse trap!!!!

0

Có vẻ như dệt may đơn giản không hỗ trợ những gì bạn muốn.

Bạn thực sự muốn chỉ cho phép một tập con HTML được kiểm soát cẩn thận, nhưng dệt được thiết kế để cho phép HTML tùy ý. Tôi không nghĩ rằng bạn có thể sử dụng dệt ở tất cả trong tình huống này (trừ khi nó hỗ trợ loại hạn chế đó).

Điều bạn cần có lẽ là phiên bản dệt "bị hạn chế" đặc biệt, chỉ cho phép đánh dấu "an toàn" (xác định rằng tuy nhiên có thể đã khó). Tôi không biết nếu điều đó tồn tại, tuy nhiên.

Bạn có thể xem BBCode, cho phép hạn chế đánh dấu có thể có.

+0

Có cũng Markdown (mà Stack Overflow sử dụng), http://daringfireball.net/projects/markdown/ –

+0

Vâng, suy nghĩ về markdown, quá. Nhưng tràn bộ đệm AFAIK thực hiện thoát bổ sung (một số blogpost của Jeff đã chỉ ra điều đó). Markdown cũng cho phép HTML tùy ý. –

+0

@David Zaslavsky: Đọc từ trang web chính thức (http://daringfireball.net/projects/markdown/syntax#overview): "Đối với bất kỳ đánh dấu nào không nằm trong cú pháp của Markdown, bạn chỉ cần sử dụng chính HTML." – Vanuan

2

này làm việc cho tôi và bảo vệ chống lại mọi cuộc tấn công XSS Tôi đã cố gắng bao gồm onmouse ... xử lý trong pre và mã khối:

<%= RedCloth.new(sanitize(@comment.body), [:filter_html, :filter_styles, :filter_classes, :filter_ids]).to_html -%> 

Các Sanitize ban đầu loại bỏ rất nhiều tiềm năng XSS khai thác về lỗ bao gồm mouseovers.

Theo như tôi có thể biết: filter_html thoát hầu hết các thẻ html ngoài mã và trước.Các bộ lọc khác có ở đó vì tôi không muốn người dùng áp dụng bất kỳ lớp, id và kiểu nào.

tôi chỉ kiểm tra trang bình luận của tôi với ví dụ của bạn

"</body>Foo" 

và nó hoàn toàn loại bỏ các thẻ cơ thể giả mạo

Tôi đang sử dụng phiên bản 4.2.3 Redcloth và Rails phiên bản 2.3.5

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