sql - Rails 4 清理用户输入

标签 sql ruby-on-rails json sanitize

我目前正在使用 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/

相关文章:

php - 我将如何在 sql 查询中执行数学运算来计算百分比差异?

php - INSERT 和 UPDATE 语句将错误数据传递到数据库

ruby-on-rails - Rails 3 date_select仅适用于年份

javascript - 在 javascript Web 应用程序中本地存储和访问数据的最佳实践是什么?

sql - 我可以在 SQL Azure 中编写数据分类脚本吗

mysql - 获取当前日期(月)起两个不同年份的月份和记录列表

mysql - 使用 cmake 在 mac 上安装 mysql 5.5 时出现问题

ruby-on-rails - 如何通过 Amazon Cloudfront 控制下载次数

ios - 在 Swift 中不使用 didSelectRowAtIndexPath 在 DetailView 中引用特定于单元格的 JSON 键

jquery - Rails/Jquery Ajax - SyntaxError : Unexpected identifier, 但 JSON 有效