当用户在我的网站上发表评论时,我会通过后端经过净化的降价格式化程序运行它,然后将其显示在网站上。
然而,这会导致小于号和大于号(<
和>
)在用户的代码示例中(用<pre>
和<code>
标记)中出现它们的HTML代码(<
和&rt;
)。括号在代码外部正确显示,但如何修复它,以便它们在代码中正确显示?
简而言之,我想要现在显示为:
if(a < b)
显示为:
if(a < b)
这是我在帮助程序中的代码,用于标记用户的评论:
def comment_markdown(text)
renderer = Redcarpet::Render::HTML.new()
markdown = Redcarpet::Markdown.new(renderer)
safe_text = sanitize text, tags: %w(b i code pre br p)
markdown.render(safe_text).html_safe
end
它在视图中称为:
<%= comment_markdown comment.text %>
Rails 已经是 HTML 安全的文本,可以在视图中显示;因此,当您在 comment_markdown
方法中调用 .html_safe
时,它会被转义两次。
只需删除您的呼叫.html_safe
:
def comment_markdown(text)
renderer = Redcarpet::Render::HTML.new()
markdown = Redcarpet::Markdown.new(renderer)
safe_text = sanitize text, tags: %w(b i code pre br p)
markdown.render(safe_text)
end
我想我只会使用 Redcarpet 的 filter_html: true
选项来防止 iframe 等出现任何安全问题。然后我不需要清理文本,所以它不会转义 pre 标签内的文本,并且它会正常显示。我只需要了解如何配置它,以便用户无法使用像标题这样分散注意力的东西。