当前位置: 首页 > 知识库问答 >
问题:

在rails中消毒用户输入的最佳方法

金亦
2023-03-14
before_validation :sanitize_content, :on => :create
def sanitize_content
  self.content = ActionController::Base.helpers.sanitize(self.content)
end

另一个选项是使用simple_format或.html_safe或sanitize(fieldname)在视图中显示数据时进行sanitize。我应该在每个字段的所有视图中以及插入上进行消毒吗?在任何地方都必须手动执行此操作似乎不是很有条不紊

谢谢你的帮助

共有1个答案

嵇丰
2023-03-14

关于用户输入和查询:确保始终使用活动记录查询方法(如.where),避免使用字符串内插传递参数;将它们作为哈希参数值或参数化语句传递。

关于呈现可能不安全的用户生成的html/javascript内容:从Rails3开始,html/javascript文本会自动进行适当转义,以便在页面上显示为纯文本,而不是解释为html/javascript,因此您不需要显式清理(或使用<%=h(potentially_unsafe_user_generated_content)%>

如果我理解正确的话,只要正确使用活动记录查询方法,您就不需要担心以这种方式对数据进行消毒。例如:

假设我们的参数映射如下所示,这是恶意用户在user_name字段中输入以下字符串的结果:

:user_name => "(select user_name from users limit 1)"

不好的方式(不要这样做):

Users.where("user_name = #{params[:id}") # string interpolation is bad here

结果查询如下所示:

SELECT `users`.* FROM `users` WHERE (user_name = (select user_name from users limit 1))
Users.where(id: params[:id]) # hash parameters
Users.where("id = ?", params[:id]) # parameterized statement
SELECT `users`.* FROM `users` WHERE user_name = '(select user_name from users limit 1)'

在创建新模型记录时对数据进行清理的情况并不适用,因为newcreate方法需要值的哈希值。即使试图将不安全的SQL代码注入到哈希中,哈希的值也被视为纯字符串,例如:

User.create(:user_name=>"bobby tables); drop table users;")

查询中的结果:

INSERT INTO `users` (`user_name`) VALUES ('bobby tables); drop table users;')

所以,和上面的情况一样。

 类似资料:
  • 在我的一个java应用程序中,有一个字段,用户应该在其中输入时间。我知道,我可以简单地将其作为一个普通的保存,在验证时,我可以检查值等等。。。 但我认为还有更好的方法。。 例如,如果这是一个日期问题,那么JXDatePicker(随附带)可以非常方便地使用。最终,用户选择的是一个日期。 同样,也必须有更好的时间选择方法。如果你知道更好的解决方案,会有人分享你的知识吗? 任何想法都值得赞赏。非常感谢

  • 我正在尝试从我的数据库中获取第三方(潜在的不安全的)html内容,并将其插入到我的html文档中。 如何安全地做到这一点(针对XSS的保护)? 在Angular1.x中,以前有来清理输入,在Angular2中如何做到这一点?据我理解,Angular2默认情况下自动对其进行消毒,是这样吗? 像这样的东西是行不通的:

  • 问题内容: 我正在为业余时间使用的聊天应用程序编写JS,并且需要具有根据用户提交的数据而变化的HTML标识符。从概念上讲,这通常有些不稳定,以至于我什至都不会尝试,但是这次我没有太多选择。然后,我需要做的是转义HTML ID,以确保它不会允许XSS或破坏HTML。 这是代码: 避免上述任何问题的最佳逃脱途径是什么?如您所见,现在我正在使用内置函数,但不确定将其与其他替代方案相比有多好。在输入到文本