【问题标题】:Allow CDATA in ActionView::Base.full_sanitizer在 ActionView::Base.full_sanitizer 中允许 CDATA
【发布时间】:2015-06-04 13:13:43
【问题描述】:

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

ActionView::Base.full_sanitizer.sanitize(value)

方法。但是,当传递给方法的value 包含在<![CDATA[ 中并且]]> 返回值为空白时,它运行良好。如何防止此方法对 CDATA 做出反应?

我尝试将它放在 application.rb 中

config.action_view.sanitized_allowed_tags = ["![CDATA[", "]]"]

但它不起作用

【问题讨论】:

    标签: html ruby-on-rails ruby cdata


    【解决方案1】:

    这不起作用,因为CDATA 不是标签,它是一个实体,它通常属于 XML 文档而不是 HTML 文档。如果你dig deep enough,你会看到Rails::Html::FullSanitizer 在后台使用Loofah,即#fragment 方法将传递的字符串作为HTML 文档片段进行解析,它忽略了后台的所有CDATA 部分。

    # === 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,像这样:

    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 产生的结果略有不同,因为后者也会删除所有&lt;form&gt; 标签,而我的代码没有。如果这对您很重要,您可以将此代码与上面的remove_xpaths 代码结合使用(请参阅link)。

    【讨论】:

    • @Leo,请看一下,如果此代码解决了您的问题,请告诉我。
    • @dodge901 你觉得我的帖子有什么冒犯性的?我根本没有胶水,请提出修改建议,我很乐意接受。
    猜你喜欢
    • 2012-07-18
    • 2014-10-08
    • 2023-04-05
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2010-12-16
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多