String.sanitize 是在 rails 或 sinatra 应用程序中防止 SQL 注入的最佳方法

Is String.sanitize, the best way to protect from SQL injection in rails or sinatra apps

string.sanitize 是防止 sql 注入的最佳方法。

我们是否需要为其安装 Sanitize gem 或者有更好的方法吗?

value = "O'Brian"
value.sanitize =>"O\'Brian"
or 
value.escape =>"O\'Brian"

它可能默认包含在 Rails 5 中,但是使用 sinatra 会怎么样。

为了防止 SQL 注入,您应该使用准备好的语句。关于所有高级数据库适配器都提供使用和正确转义变量的功能。在 ActiveRecord 中,这看起来像这样:

value = "O'Brian"
Person.where(name: value).to_sql
# => "SELECT `people`.* FROM `people`  WHERE `people`.`name` = 'O\'Brian'"

其他数据库适配器,如 Sequel 或 DataMapper 具有类似的功能。

当使用像 pgmysql2 这样的普通数据库适配器时,您可以在数据库级别使用普通的准备语句。

对于 mysql2,这可能看起来像这样:

value = "O'Brian"
statement = @client.prepare("SELECT * FROM people WHERE name = ?")
result = statement.execute(value)

或者,所有适配器都提供特定于数据库的字符串转义方法。但是您通常应该坚持使用准备好的语句,因为当您只是不尝试推理转义而是将所有这些委托给始终如一地执行此操作的库时,使用它们会更安全。

作为关于 sanitize 方法和 sanitize gem 的最后说明,它们 不打算 转义 SQL 碎片,并且在以这种方式使用时不会使您免于 SQL 注射。 sanitize gem 用于确保 HTML 代码仅包含安全的白名单标签和属性。它与转义 SQL 无关,如果以这种方式使用将导致易受攻击的代码!