ruby 为什么Rails sanitize()在rspec和模型中的表现不同?

sd2nnvve  于 2023-05-28  发布在  Ruby
关注(0)|答案(1)|浏览(129)

在我的config/initializers中,我向String类添加了以下内容:

class String
  def sanitize(options={ tags: %w(div p span strong b em i br ol ul li) })
    ActionController::Base.helpers.sanitize(self, options)
  end
end

在我的本地开发站点上,这会将所有不允许的标记转换为编码的HTML,所以

"<span><img src=\"nonexistent.png\" onerror=\"alert('This alert should not be shown');\"></span><p>Build something</p>"

成为

"<span>&lt;img src=\"nonexistent.png\" onerror=\"alert('This alert should not be shown');\"/&gt;</span><p>Build something</p> "

但是在rspec中,对同一个字符串调用同一个方法会导致:

"<span></span><p>Build something</p>"

它不再编码图像标签;它只是把标签完全剥离了。模型规格中的行为与模型中的行为不同的原因是什么?

2w3rbyxf

2w3rbyxf1#

很难说很容易查到。主要是:不要这样做。
很难知道:有什么东西在破坏你的消毒方法还是你在破坏别人的?
很容易发现:编写一个测试。在调用sanitize之前设置断点。踩进去,继续踩。你可能很快就会看到发生了什么。
不要这样做:
1.其他东西要么添加该方法,要么从其他东西调用sanitize。我不确定什么是适合您的解决方案,但可能控制器或辅助方法sanitize(string, options)比您所做的更好。毕竟,这就是你所说的。
1.如果你必须添加一个方法,不要像你做的那样打开类并进行破坏:

module StringSanitizer
  def sanitize(...)
    super # if appropriate - see if it already exists in the class or if something else has already added it
    ActionController::Base.helpers.sanitize(self, options)
  end
end
String.prepend(StringSanitizer)

相关问题