【问题标题】:Rails - How to only escape <script> tagRails - 如何只转义 <script> 标签
【发布时间】:2016-03-01 08:29:21
【问题描述】:

在 Rails 中,我看到了
+ html_escape:转义所有标签。
+ sanitize:删除所有不在 whilelist 中的标签。

现在,我只想转义脚本标签,而不是转义其他标签。

你有解决办法吗?谢谢大家!

【问题讨论】:

  • 您使用的是哪个版本的导轨?
  • 我正在使用 Rails 4.2.5
  • 提醒一下 - JavaScript 也可以嵌入到其他标签中,而不仅仅是 &lt;script&gt;,所以请注意未转义的内容。

标签: ruby-on-rails


【解决方案1】:

当您在 rails 4.2.5 上时,您可以使用与 rails 一起安装的 https://github.com/rails/rails-html-sanitizer。您可以执行以下操作以仅转义脚本标记。

scrubber = Rails::Html::TargetScrubber.new
scrubber.tags = ['script']

html_fragment = Loofah.fragment('<script></script><div></div>')
html_fragment.scrub!(scrubber)
html_fragment.to_s # outputs "<div></div>"

【讨论】:

    【解决方案2】:
     string = '<html> <title> <head> <script type="javascript"></script> </head> </title> </html>'
    
     string.gsub(/<script.*[\s\S]*\/script>/,"")
    
     => "<html> <title> <head>  </head> </title> </html>"
    

    更新

    如果您使用的是 Rails 4.2.5,您可能需要这个。

    Rails::HTML::TargetScrubber

    【讨论】:

      【解决方案3】:

      Rails 为字符串/HTML 实体提供了如此多的选项

        s = "<script>alert('Hello');</script>"  
      

      选项:WhiteListSanitizer

       white_list_sanitizer = Rails::Html::WhiteListSanitizer.new
       white_list_sanitizer.sanitize(s, tags: %w())
       white_list_sanitizer.sanitize(s, tags: %w(table tr td), attributes: %w(id class style))
        => "alert('Hello');"
      

      请参考此链接

      How to show some HTML entities on title tag using Rails

      【讨论】:

        【解决方案4】:
        string.gsub!(/<(?=script)||(?<=script)>/) {|x| "#\{x}"}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-13
          • 2015-04-22
          • 1970-01-01
          • 1970-01-01
          • 2015-12-26
          • 1970-01-01
          相关资源
          最近更新 更多