Rails 4 清理用户输入
Posted
技术标签:
【中文标题】Rails 4 清理用户输入【英文标题】:Rails 4 Sanitizing User Input 【发布时间】:2014-09-08 10:58:26 【问题描述】:我目前正在使用 Ruby on Rails 制作 API。我只是想知道是否有内置的 Rails 方法或库/宝石来清理 Json 和 SQL,或者 Rails 4 默认情况下是否这样做?我最担心这样的情况,我有一个 SQL 语句,例如
User.where("users.first_name IS NOT NULL")
或类似的东西
Event.where(:location => params[:location]).
基本上,在我的 SQL 语法和传入的 JSON 请求中我应该注意什么?
【问题讨论】:
【参考方案1】:如果您正确格式化查询,Rails 会自动执行此操作
来自guides - 不要这样做:
Project.where("name = '#params[:name]'")
改为
Project.where("name = ?", params[:name])
【讨论】:
关于插值的问号很好,但我不清楚Event.where(:location => params[:location]).
是否会被清理。
@maxpleaner 它会做 - further down the guides page【参考方案2】:
默认情况下,使用以下命令将清理 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')
【讨论】:
这是一个不错的解决方案。 谢谢,太好了!以上是关于Rails 4 清理用户输入的主要内容,如果未能解决你的问题,请参考以下文章