我试过使用Sanitize
gem来清理包含网站HTML的字符串。
它只删除了<script>
标签,而不是脚本标签内的JavaScript。
我可以用什么从页面中删除JavaScript ?
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
我偏爱丝瓜宝石。修改自文档中的示例:
1.9.3p0 :005 > Loofah.fragment("<span onclick='foo'>hello</span> <script>alert('OHAI')</script>").scrub!(:prune).to_s
=> "<span>hello</span> "
您可能对Loofah提供的ActiveRecord扩展感兴趣。
事实证明,Sanitize
有一个内置的选项(只是没有很好地记录)…
Sanitize.clean(content, :remove_contents => ['script', 'style'])
这删除了所有的脚本和样式标签(和他们的内容),我想。
所以你需要添加sanitize
gem到你的Gemfile:
gem 'sanitize`
Then bundle
然后输入Sanitize.clean(text, remove_contents: ['script', 'style'])
我使用这个正则表达式来消除嵌入内容中的<script>
和</script>
标记,只是使标记消失。它还可以摆脱< script>
或< /script >
等东西…即添加空白
post.content = post.content.gsub(/<s*scripts*>|<s*/s*scripts*>/, '')
删除所有脚本标签
html_content = html_content.gsub(/<script.*?>[sS]*</script>/i, "")
源删除所有<script>
标签及其内容:
regex = /<s*ss*cs*rs*is*ps*t.*?>.*?<s*/s*ss*cs*rs*is*ps*ts*>|<s*ss*cs*rs*is*ps*t.*?>|<s*/s*ss*cs*rs*is*ps*ts*>/im
while text =~ regex
text.gsub!(regex, '')
end
这甚至可以处理如下情况:
<scr<script></script>ipt>alert('hello');</scr</script>ipt>
<script class='blah' >alert('hello');</script >
和其他技巧。但是,它不会删除通过onload=
或onclick=
执行的JavaScript。