是string.sanitize防止sql注入的最佳方法。
我们需要为它安装消毒宝石吗
还是有更好的办法?

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方法和sanitizegem,最后一点要注意的是,它们不是用来转义SQL片段的,这样使用时也不会使您免于SQL注入sanitize gem用于确保HTML代码只包含安全的白名单标记和属性它与转义sql无关,如果这样使用,将导致易受攻击的代码!

09-20 17:48