2016-03-02 18 views
1

是string.sanitize防止sql注入的最佳方法。是String.sanitize,在rails或sinatra應用程序中防止SQL注入的最佳方法

我們是否需要安裝Sanitize gem 還是有更好的方法嗎?

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

它可能包括在默認情況下在Rails 5,但使用sinatra。

+0

您的查詢如何查看?如果你不是建立它們,但設置變量,你可能甚至不需要... –

+0

我認爲是更好的使用參數。 –

+0

問題是針對Web應用程序的安全性,我剛剛看到ActiveRecord中我們可以使用不同的Sanitize方法,但是因爲我也有Sinatra應用程序,所以我漫遊如何爲應用程序添加安全 – FredyK

回答

5

爲了防止SQL注入,您應該準備好語句。關於所有高級數據庫適配器都提供了使用和正確轉義變量的功能。在ActiveRecord的,這看起來是這樣的:

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

像續集或DataMapper的其他數據庫適配器有類似的功能。

使用像pgmysql2這樣的普通數據庫適配器時,可以在數據庫級別使用簡單準備語句。

隨着mysql2,這可能是這樣的:

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

另外,所有適配器提供數據庫特定的字符串逃生方法。但是你通常應該堅持準備好的語句,因爲當你不試圖推理轉義時,它們更安全,但是將所有這些委託給一個能夠保持一致的庫。

至於有關sanitize方法和sanitize寶石最後一點,他們不打算轉義SQL片段,並用這種方式時,將不會從SQL注入救你。清理寶石用於確保HTML代碼僅包含安全列入白名單的標籤和屬性。它與轉義SQL無關,如果以這種方式使用,將導致易受攻擊的代碼!