为什么Rubocop不允许在Rails中使用html_safe或raw()函数

3

这是我的代码,不通过Rubocop的原因是:

Rails/OutputSafety:将字符串标记为html安全可能会带来安全风险。

def number_with_html_delimiter(num)
   number_with_delimiter(num)
      .gsub!(' ', content_tag(:span, "", class: "numbers-delimiter")).html_safe
end

我需要将一些 CSS 样式的自定义 span 标签放入 HTML 内以增加空格,但当我删除 html_safe 时它无法正常工作。
请帮助我,提前感谢。

如果您不介意在所有语言环境中使用<span>分隔符,我建议使用number_with_delimiter(num,delimiter:tag.span(class: 'numbers-delimiter')).html_safe。即使没有这种情况,您也不希望将html_safe更改为gsub!,因为如果没有进行替换,则gsub!返回nil - 3limin4t0r
谢谢!我使用了number_with_delimiter(num, delimiter: tag.span(class: 'numbers-delimiter')),它很有效! - Kara
2个回答

2

html_saferaw()不安全,可能存在安全风险。您可以在使用html_safe(或raw)方法的代码前后使用# rubocop:disable Rails/OutputSafety# rubocop:enable Rails/OutputSafety来禁用rubocop以确保安全性。

# rubocop:disable Rails/OutputSafety
def number_with_html_delimiter(num)
   number_with_delimiter(num)
      .gsub!(' ', content_tag(:span, "", class: "numbers-delimiter")).html_safe
end
#rubocop:enable Rails/OutputSafety

2
禁用 rubocop 规则并不能解决问题。 - tagaism

1

根据Rails文档,建议使用sanitize来处理常见的标签和属性。

在你的帮助函数中:

# Use `!` to indicate that `sanitize` should be used
def number_with_html_delimiter!(num)
   number_with_delimiter(num)
      .gsub(' ', content_tag(:span, "", class: "numbers-delimiter")).html_safe
end

在您的看法中:

<%= sanitize number_with_html_delimiter!(1000) %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接