10

Tôi đã thử sử dụng đá quý Sanitize để xóa chuỗi chứa HTML của trang web.Xóa tất cả JavaScript khỏi trang HTML

Nó chỉ xóa các thẻ <script> chứ không xóa JavaScript bên trong thẻ tập lệnh.

Tôi có thể sử dụng những gì để xóa JavaScript khỏi một trang?

+2

Bạn cũng muốn xóa tất cả thuộc tính 'on *'? – Phrogz

Trả lời

5

Tôi là một phần của đá quý Loofah. Sửa đổi từ một ví dụ trong tài liệu:

1.9.3p0 :005 > Loofah.fragment("<span onclick='foo'>hello</span> <script>alert('OHAI')</script>").scrub!(:prune).to_s 
=> "<span>hello</span> " 

Bạn có thể quan tâm đến các ActiveRecord extensions Loofah cung cấp.

13
require 'open-uri'  # included with Ruby; only needed to load HTML from a URL 
require 'nokogiri'  # gem install nokogiri read more at http://nokogiri.org 

html = open('http://stackoverflow.com')    # Get the HTML source string 
doc = Nokogiri.HTML(html)       # Parse the document 

doc.css('script').remove        # Remove <script>…</script> 
puts doc            # Source w/o script blocks 

doc.xpath("//@*[starts-with(name(),'on')]").remove # Remove on____ attributes 
puts doc            # Source w/o any JavaScript 
+0

Điều này có vẻ như một ý tưởng thực sự tồi tệ nếu bạn có ý định ngăn chặn các cuộc tấn công XSS. Có tất cả các loại trường hợp cạnh bạn đang thiếu. https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet – Ajedi32

6

Nó chỉ ra rằng Sanitize có một tùy chọn xây dựng trong (chỉ không tốt tài liệu) ...

Sanitize.clean(content, :remove_contents => ['script', 'style']) 

này loại bỏ tất cả các thẻ kịch bản và phong cách (và nội dung của họ) như tôi muốn.

0

Vì vậy, bạn cần phải thêm sanitize đá quý để Gemfile của bạn:

gem 'sanitize` 

Sau đó bundle

Và sau đó bạn có thể làm Sanitize.clean(text, remove_contents: ['script', 'style'])

0

tôi sử dụng biểu thức chính quy này để thoát khỏi <script></script> thẻ trong nội dung được nhúng và chỉ làm cho các thẻ biến mất. Nó cũng loại bỏ những thứ như < script> hoặc </script> ... v.v. tức là thêm khoảng trắng.

post.content = post.content.gsub(/<\s*script\s*>|<\s*\/\s*script\s*>/, '')