dim*_*mus 36 sql ruby-on-rails sanitize
我必须清理sql查询的一部分.我可以这样做:
class << ActiveRecord::Base
public :sanitize_sql
end
str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '')
Run Code Online (Sandbox Code Playgroud)
但它不安全,因为我公开了受保护的方法.有什么更好的方法呢?
小智 42
你可以使用:
ActiveRecord::Base::sanitize(string)
Run Code Online (Sandbox Code Playgroud)
这个问题没有说明答案必须来自,ActiveRecord也没有说明它应该是哪个版本的Rails.出于这个原因(并且因为它是顶部和少数之一)关于如何在Rails中清理参数的答案......
这里有一个与Rails 4一起使用的解决方案:
在ActiveRecord::Sanitization::ClassMethods你有sanitize_sql_for_conditions和其他两个别名:
sanitize_conditions和sanitize_sql.三者确实完全相同.
sanitize_sql_for_conditions
接受SQL条件的数组,散列或字符串,并将它们清理为WHERE子句的有效SQL片段.
您也可以在ActiveRecord中使用
sanitize_sql_for_assignment 哪一个
接受SQL条件的数组,散列或字符串,并将它们清理为SET子句的有效SQL片段.
查看文档
但是,在ActionController中,您可以使用ActionController::Parameters它
选择哪些属性应该列入白名单以进行批量更新,从而防止意外暴露不应暴露的属性.为此提供两种方法:require和permit.
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
Run Code Online (Sandbox Code Playgroud)
"参数魔术"称为"强参数"(此处为docs),您可以使用它来在控制器中将参数发送到模型之前对其进行清理.
ActionController::Base,因此包含在任何Rails控制器中.我希望这有助于任何人,如果只是为了学习和揭开Rails的神秘面纱!:)
从 rails 5 开始,推荐的方法是使用: ActiveRecord::Base.connection.quote(string)
如此处所述:https : //github.com/rails/rails/issues/28947
ActiveRecord::Base::sanitize(string) 已弃用
您可以protected通过间接调用来绕过方法的本质:
str = ActiveRecord::Base.__send__(:sanitize_sql, ["AND column1 = ?", "two's"], '')
Run Code Online (Sandbox Code Playgroud)
...至少将使您不必将该方法重新设置为public。
(我有点怀疑您实际上是否需要执行此操作,但是以上方法可以正常工作。)