gpt4 book ai didi

sql - Rails 4 清理用户输入

转载 作者:行者123 更新时间:2023-12-04 09:18:14 25 4
gpt4 key购买 nike

我目前正在使用 Ruby on Rails 制作 API。我只是想知道是否有内置的 Rails 方法或库/ gem 来清理 Json 和 SQL,或者 Rails 4 默认情况下是否这样做?我最担心我有 SQL 语句的情况,例如

User.where("users.first_name IS NOT NULL") 

或类似的东西
Event.where(:location => params[:location]). 

本质上,在我的 SQL 语法和传入的 JSON 请求中我应该注意什么?

最佳答案

默认情况下,使用以下命令将清理 str并使它成为 远离 SQL 注入(inject) :

User.where(name: str)
User.where('name ILIKE ?', str)

然而,下面的代码(直接字符串插值然后给 where 方法)使它成为 SQL 注入(inject)不安全 :
User.where("name = '#{str}'")

在你的情况下 , 你可以使用 ActiveRecord::Base.sanitize(your_string_from_user_input) .它将使用您的数据库适配器转义/引用相关部分, 防止 SQL 注入(inject) .

在Model中,可以直接访问 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')

关于sql - Rails 4 清理用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24805784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com