html - ruby rails : Allow less than sign '<' inside code block with sanitize helper

标签 html ruby-on-rails escaping sanitize

我试图在 Rails 中转义用户生成的内容。我使用带有 sanitizeraw 助手的 raw 来过滤这样的内容:

raw(sanitize(code, :tags =>   ['<', 'h2','h3','p','br','ul','ol','li','code','pre','a'] ))

内容中允许提及的标签列表。

问题是当我尝试使用这样的 sql 查询对其进行测试时:

mysql -u sat -p -h localhost database <  data.sql

precode block 中,它会删除小于号 (<) 之后的所有内容。

请帮我想办法做到这一点。

最佳答案

我认为使用 Rails 中的默认清理方法是不可能的。

改为尝试使用 Sanitize gem ( https://github.com/rgrove/sanitize )

require 'sanitize'

allowed_elements = ['h2','h3','p','br','ul','ol','li','code','pre','a']
code             = "<pre>mysql -u sat -p -h localhost database < data.sql</pre>"

Sanitize.fragment(code, elements: allowed_elements)
# => <pre>mysql -u sat -p -h localhost database &lt; data.sql</pre>

要使用它来将经过清理的内容保存到数据库中,请向您的模型添加一个 before_save 过滤器,该过滤器对用户生成的内容运行清理并存储结果,例如

class MyModel < ActiveRecord::Base 
  ALLOWED_ELEMENTS = ['h2','h3','p','br','ul','ol','li','code','pre','a']

  before_save :sanitize_code

  private

  def sanitize_code
    self.code = Sanitize.fragment(code, elements: ALLOWED_ELEMENTS)
  end
end

当您输出内容时,您只需要使用原始 View 助手,例如

<%= raw @instance.code %>

关于html - ruby rails : Allow less than sign '<' inside code block with sanitize helper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36371252/

相关文章:

jquery - 无法使用 CSS 创建下拉菜单? li 都在彼此之上?

javascript - j 呈现的 collection_select 输出 HTML <\/option>\n

c++ - c++ 中的 WinXP 控制台光标控制字符是什么?

html - Chrome 似乎错误地计算了打印时以毫米为单位给出的 css 尺寸

php - 第二次调用 Codeigniter View 后背景图像消失

ruby-on-rails - Rails 模型中不区分大小写的搜索

node.js - 如何在 express/jade 中将非 ASCII 字符编码为\uXXXX 序列

javascript - 如何使用 JavaScript 正则表达式在单词边界之间找到用户提供的字符串?

javascript - 根据变量值隐藏表行

ruby-on-rails - Rails 3 和 Mongoid : Embedded documents validation