如何清理Rails中的sql片段
我必须清理sql查询的一部分。我可以这样做:如何清理Rails中的sql片段,sql,ruby-on-rails,sanitize,Sql,Ruby On Rails,Sanitize,我必须清理sql查询的一部分。我可以这样做: class << ActiveRecord::Base public :sanitize_sql end str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '') classActiveRecord::Base.connection.quote在Rails 3.x中实现了这一功能,您只需使用: ActiveRecord::Base::saniti
class << ActiveRecord::Base
public :sanitize_sql
end
str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '')
classActiveRecord::Base.connection.quote
在Rails 3.x中实现了这一功能,您只需使用:
ActiveRecord::Base::sanitize_sql(string)
这个问题没有指定答案必须来自ActiveRecord
,也没有指定它应该是哪个版本的Rails。出于这个原因(而且因为它是关于如何清理Rails中的参数的最重要和为数不多的答案之一)
下面是一个与Rails 4配合使用的解决方案:
在ActiveRecord::Sanitization::ClassMethods
中,您有sanitize\u sql\u for\u conditions及其两个别名:
清理条件和清理sql。这三个人做着完全相同的事情
针对条件对sql进行清理
接受SQL条件的数组、哈希或字符串并进行清理
将它们转换为WHERE子句的有效SQL片段
在ActiveRecord中也有
为分配清理sql\u
接受SQL条件的数组、哈希或字符串并对其进行清理
转换为SET子句的有效SQL片段
- 默认情况下,上述方法包含在ActiveRecord::Base中,因此包含在任何ActiveRecord模型中
看
然而,在ActionController中还有ActionController::Parameters
,它允许您
选择应将哪些属性列入白名单以进行批量更新和
这样可以防止意外暴露不应该暴露的东西。
为此提供了两种方法:要求和允许
params = ActionController::Parameters.new(user: { name: 'Bryan', age: 21 })
req = params.require(:user) # will throw exception if user not present
opt = params.permit(:name) # name parameter is optional, returns nil if not present
user = params.require(:user).permit(:name, :age) # user hash is required while `name` and `age` keys are optional
“Parameters magic”称为Strong Parameters(),您可以使用它在将控制器中的参数发送到模型之前对其进行清理
- 上述方法默认包含在
ActionController::Base
中,因此包含在任何Rails控制器中
我希望这对任何人都有帮助,哪怕只是为了学习和揭开Rails的神秘面纱!:) 从rails 5开始,推荐的方法是使用:ActiveRecord::Base.connection.quote(string)
如下文所述:
ActiveRecord::Base::sanitize(string)
不推荐使用注意,当涉及到清理SQL WHERE条件时,最好的解决方案是,因为它正确地处理了NULL条件(例如,如果传递了nil属性,将生成is NULL
而不是=NULL
)
出于某种原因,它在Rails 5中被弃用。因此,我推出了一个经得起未来考验的版本,请参见此处:您能给我们提供更多的背景信息吗sanitize_sql
和friends通常在AR::Base派生类中调用,而不需要改变可视性,这是一个好的有效点。当我使用某人的私有或受保护的方法时,我会畏缩。这将委托给ActiveRecord::Base.connection.quote
(至少在Rails 4中)已弃用。新的消毒方法。请参阅Bryan的《我将此答案从不推荐的版本(sanitize
)更新为Rails 6的当前工作版本(sanitize\u sql
)。如果有人想全面解释所有的清理方法,我建议。是否需要
和允许
针对SQL注入清理参数,或者只是验证它们的存在?它不进行清理,只是验证presence@Matt:吉米是对的,要求
和允许
不要自己进行任何消毒。但是ActionController::Parameters.new
会进行清理,因此所有控制器都应该已经清理了所有参数。我会在以后有时间的时候更新我的答案,因为我还发现了这个非常酷的宝石,叫做rails html消毒剂,谢谢Bryan。我所处的情况是,我向我的控制器发送大量JSON,并且要处理3s+以上的响应时间。通过消除JSON中的冗余,我可以将这些时间减少到2秒,通过不实例化ActiveRecord对象,我可以将时间进一步减少到500毫秒以下。只是想确定我暴露了安全隐患!请注意,上面的清理方法是受保护的类方法,因此您需要从AR类中调用它们,或者通过自己的AR类中的公共类方法公开它们。不推荐使用这种方法。用布莱恩的卫生API代替。