我目前正在使用Ruby on Rails创建API。我只是想知道是否有内置的Rails方法或库/ gems来清理Json和SQL,或者Rails 4是否默认执行此操作?我最担心的是我有一个SQL语句,例如
User.where("users.first_name IS NOT NULL")
或类似
Event.where(:location => params[:location]).
基本上,我应该在SQL语法和传入的JSON请求中注意什么?
答案 0 :(得分:13)
默认情况下,使用以下内容将清理str
并使其安全地不受SQL注入:
User.where(name: str)
User.where('name ILIKE ?', str)
但是,以下代码(直接字符串插值然后赋予where
方法)使得从SQL注入中不安全:
User.where("name = '#{str}'")
在您的情况下,您可以使用ActiveRecord::Base.sanitize(your_string_from_user_input)
。它将使用您的数据库适配器来转义/引用相关部分,防止SQL注入。
在模型中,您可以直接访问sanitize
方法(因为您在已经从ActiveRecord :: Base继承的上下文中):
class User < ActiveRecord::Base
def self.search(string)
terms = string.split
searchable_columns = [:name, :username, :whatever]
query = terms.map do |term|
fields = searchable_columns.map |column|
" #{self.table_name}.#{column} LIKE '#{sanitize("%#{term}%")}'"
end
"(#{fields.join(' OR ')})"
end.join(' AND ')
where(query)
end
end
上面的代码将生成一个SQL WHERE子句,如下所示:
# str is 'bob doe'
WHERE
(users.name LIKE 'bob' OR users.username LIKE 'bob' OR users.whatever LIKE 'bob')
AND
(users.name LIKE 'doe' OR users.username LIKE 'doe' OR users.whatever LIKE 'doe')
答案 1 :(得分:9)
如果您正确格式化查询,Rails会自动执行此操作
来自guides - 请勿执行以下操作:
Project.where("name = '#{params[:name]}'")
取而代之的是
Project.where("name = ?", params[:name])