Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何清理Rails中的sql片段_Sql_Ruby On Rails_Sanitize - Fatal编程技术网

如何清理Rails中的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

我必须清理sql查询的一部分。我可以这样做:

class << ActiveRecord::Base
  public :sanitize_sql
end

str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '')

class
ActiveRecord::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代替。