是String.sanitize,是保护rails或sinatra应用程序中的SQL注入的最佳方法

Fre*_*dyK 1 ruby sql sql-injection ruby-on-rails sinatra

string.sanitize是保护sql注入的最佳方法.

我们需要为它安装Sanitize gem还是有更好的方法?

value = "O'Brian"
value.sanitize =>"O\'Brian"
or 
value.escape =>"O\'Brian"
Run Code Online (Sandbox Code Playgroud)

它可能默认包含在Rails 5中,但是如何使用sinatra.

Hol*_*ust 6

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

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

Sequel或DataMapper等其他数据库适配器具有类似的功能.

使用像pg或的普通数据库适配器时mysql2,可以在数据库级别使用普通的预准备语句.

使用mysql2,它看起来像这样:

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

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

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