我正在制作自己的 API,我想知道:如何保護收到的引數?
例子:
- 我有一個帶有
brand和color屬性的汽車模型。
我的端點在有效負載中接收這些引數。有了這個收到的有效載荷,我在我的資料庫中搜索:
car = Car.where(color: params[:color])
# or
car = Car.find_by(brand: params[:brand])
# or writing
Car.first.update!(brand: params[:brand])
但是我很擔心如果有人試圖利用 SQL 或 XSS 進行攻擊怎么辦?你如何處理這個問題?
非常感謝 :)
uj5u.com熱心網友回復:
您問題中的示例都自動防止 SQL 注入。
官方Rails Guides 的相關參考:
7.2.1 簡介
SQL 注入攻擊旨在通過操縱 Web 應用程式引數來影響資料庫查詢。SQL 注入攻擊的一個流行目標是繞過授權。另一個目標是執行資料操作或讀取任意資料。以下是如何在查詢中不使用用戶輸入資料的示例:
Project.where("name = '#{params[:name]}'")
然后稍后在同一個檔案中:
7.2.4 對策
Ruby on Rails 有一個用于特殊 SQL 字符的內置過濾器,它將轉義
'、"、 NULL 字符和換行符。使用Model.find(id)或Model.find_by_some thing(something)自動應用此對策。但是在 SQL 片段中,尤其是在條件片段(where("..."))中,connection.execute()或Model.find_by_sql()方法中,它必須手動應用。您可以使用位置處理程式來清理受污染的字串,而不是傳遞字串,如下所示:
Model.where("zip_code = ? AND quantity >= ?", entered_zip_code, entered_quantity).first第一個引數是帶有問號的 SQL 片段。第二個和第三個引數將用變數的值替換問號。
您還可以使用命名處理程式,這些值將從使用的哈希中獲取:
values = { zip: entered_zip_code, qty: entered_quantity } Model.where("zip_code = :zip AND quantity >= :qty", values).first此外,您可以拆分和鏈接對您的用例有效的條件:
Model.where(zip_code: entered_zip_code).where("quantity >= ?", entered_quantity).first
uj5u.com熱心網友回復:
您應該避免將字串作為引數傳遞給 Active Records 方法。
請改用陣列或散列。因此,要修復易受攻擊的代碼,請避免以下操作:
car = Car.where(color: params[:color])
而不是直接使用用戶輸入,您應該將其作為引數傳遞:
car = Car.where(["color = ?", params[:color])
這種方法幾乎可以應用于所有方法,因此可以幫助您避免幾乎所有 SQL 注入漏洞。
您可以做的另一個是使用基于屬性的查找器方法:
car = Car.find_by(brand: params[:brand])
通過這樣做,Active Records 將自動正確地轉義不需要的字符,這通常會導致 SQL 注入發生。
有關更多資訊,請參閱:
- https://www.stackhawk.com/blog/sql-injection-prevention-rails/
- https://www.netsparker.com/blog/web-security/sql-injection-ruby-on-rails-development/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/407728.html
標籤:
上一篇:有什么方法可以忽略DataGrip上的這些SQL警告?
下一篇:無法在T-SQL中獲取表列約束
