首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ActionView::Base.full_sanitizer中允许CDATA

在ActionView::Base.full_sanitizer中允许CDATA
EN

Stack Overflow用户
提问于 2015-03-31 16:58:29
回答 1查看 455关注 0票数 2

我正在删除众所周知的html内容。

代码语言:javascript
复制
ActionView::Base.full_sanitizer.sanitize(value)

方法。但是,当传入方法的value被包装在<![CDATA[中并且]]>返回值为空时,它可以很好地工作。如何防止此方法对CDATA做出反应?

我尝试的是将这个放入application.rb

代码语言:javascript
复制
config.action_view.sanitized_allowed_tags = ["![CDATA[", "]]"]

但它不起作用

EN

回答 1

Stack Overflow用户

发布于 2015-09-08 21:16:42

这是行不通的,因为CDATA不是一个标记,而是一个实体,而且它通常属于XML文档而不是HTML文档。如果你使用dig deep enough,你会发现Rails::Html::FullSanitizer在幕后使用了Loofah,也就是说,它的#fragment方法委托将传递的字符串解析为超文本标记语言文档片段,忽略了幕后的所有CDATA部分。

代码语言:javascript
复制
# === Rails::Html::FullSanitizer
# Removes all tags but strips out scripts, forms and comments.
#
# full_sanitizer = Rails::Html::FullSanitizer.new
# full_sanitizer.sanitize("<b>Bold</b> no more!  <a href='more.html'>See more here</a>...")
# # => Bold no more!  See more here...
class FullSanitizer < Sanitizer
  def sanitize(html, options = {})
    return unless html
    return html if html.empty?

    Loofah.fragment(html).tap do |fragment|
      remove_xpaths(fragment, XPATHS_TO_REMOVE)
    end.text(options)
  end
end

因此,解决方案就是直接使用Loofah,如下所示:

代码语言:javascript
复制
text = "<div>in div</div> just text <![CDATA[ in cdata ]]> <script>alert(1);</script> <form>some form</form> <!-- some comments also -->"
# => "<div>in div</div> just text <![CDATA[ in cdata ]]> <script>alert(1);</script> <form>some form</form> <!-- some comments also -->"
Loofah.scrub_xml_fragment(text, :prune).text
# => "in div just text  in cdata   some form "

这段代码的结果与FullSanitizer产生的结果略有不同,因为后者还删除了所有的<form>标记,而我的代码没有。如果这对你很重要,你可以将这段代码与上面的remove_xpaths代码结合起来(参见link)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29364552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档