2011-11-08 18 views
9

Ngay bây giờ chúng tôi đang sử dụng đá quý Sanitize: https://github.com/rgrove/sanitizeRails Gem khử trùng - Làm thế nào để tạo danh sách trắng &

Vấn đề là nếu bạn nhập "hello & world" Sanitize đang cứu rằng trong DB như:

hello & world 

Làm thế nào bạn có thể đưa vào danh sách trắng &. Chúng tôi muốn khử trùng để xóa tất cả các thẻ html và JS/script độc hại có thể có. nhưng chúng tôi vẫn cho phép dấu và.

Ý tưởng? Cảm ơn

+0

Có thể được Sanitize.cl ean (html, Sanitize :: Config :: RELAXED) # => '&' –

+0

Cảm ơn nhưng RELAXED chỉ cho phép mọi thứ. Tôi muốn vào danh sách trắng và không thể tìm hiểu cách thức – AnApprentice

+0

@ bilash.saha Cấu hình thư giãn sẽ vẫn là các thực thể thoát HTML, những gì bạn đã đăng sẽ vẫn xuất ra "Hello & world" – Unixmonkey

Trả lời

2

Sanitize sẽ luôn chuyển đổi đầu ra thành các thực thể html cho html/xhtml hợp lệ.

Cách tốt nhất mà tôi có thể xác định là lọc đầu ra

Sanitize.clean("hello & world").gsub('&','&') #=> "Hello & world" 
+0

Điều này sẽ giải quyết & ký tự, nhưng không chia tỷ lệ cho tất cả các ký tự khác nhau mà công cụ html được sử dụng sẽ chuyển đổi thành các thực thể. Cố gắng theo dõi tất cả những gì sẽ là một nhức đầu là tốt. @ agustin của câu trả lời dưới đây là một giải pháp tốt hơn IMO –

+0

@ShyamHabarakada Vấn đề tôi có với Rails 'được xây dựng trong 'sanitize()' và 'strip_tags', là họ không sửa lỗi đánh dấu sai, do đó, một ký tự' '' chưa từng có phá hủy bố cục trang. 'strip_tags ('Strip " Strip Unixmonkey

+0

Đúng vậy, về đánh dấu không đúng định dạng. Chúng tôi khử trùng chủ yếu như một cách để ngăn chặn HTML xâm nhập vào các thông số không nên có HTML. Tước thẻ thông qua việc xây dựng trong strip_tags hoạt động tốt cho chúng tôi về điều đó. Có vẻ như đó cũng là kịch bản trong câu hỏi này. Tôi đồng ý, nếu bạn muốn vệ sinh đầy đủ, một giải pháp tốt hơn có công cụ DOM thích hợp là cần thiết. Nhưng đối với vệ sinh thông số, IMO, có vẻ như quá mức. –

1

câu trả lời UnixMonkey là những gì chúng ta đã kết thúc làm.

def remove_markup(html_str) 
    marked_up = Sanitize.clean html_str 

    ESCAPE_SEQUENCES.each do |esc_seq, ascii_seq| 
     marked_up = marked_up.gsub('&' + esc_seq + ';', ascii_seq.chr) 
    end 
    marked_up 
    end 

Nơi ESCAPE_SEQUENCES là một mảng các ký tự chúng tôi không muốn thoát.

+0

Xem http://www.escapecodes.info/ để biết các mã ký tự thoát – tee

0

Tính đến Rails 4.2, #strip_tags không unencode HTML ký tự đặc biệt

strip_tags("fun & co") 
    => "fun & co" 

Nếu không, bạn sẽ nhận được như sau:

strip_tags("<script>") 
    => "<script>" 

Nếu bạn chỉ muốn dấu và tôi muốn đề nghị lọc sản lượng như @Unixmonkey đã đề xuất và giữ nó ở số & chỉ

strip_tags("<bold>Hello & World</bold>").gsub(/&amp;/, "&") 
    => "Hello & World"