簡體   English   中英

為什么使用參數化查詢或實體框架會阻止sql注入?

[英]Why does using parameterized queries or entity framework prevent sql injection?

我已經很好地掌握了SQL注入。 這是一個SQL查詢應該是什么樣的

SELECT FirstName, LastName 
FROM Customers 
WHERE CustomerId = @valueFromApplication

變成了像這樣的查詢

SELECT FirstName, LastName 
FROM Customers 
WHERE CustomerId = '' ; DROP DATABASE Foo --

當用戶將惡意值插入您的應用程序,網站,客戶端等等時......我也知道,攻擊者可以嘗試發現表的名稱並從中獲取信息,而不僅僅是刪除數據庫。

我也知道一些有助於防止這種情況的事情:

  1. 使用帶參數的存儲過程(SQL Server)
  2. 使用參數化SQL查詢
  3. 使用Entity Framework / LINQ to Entities(C#,也許是F#?)

這些事情實際上如何防止SQL注入發生? 為什么攻擊者不能將相同的惡意值傳遞給他或她已經使用的任何輸入並且具有相同的結果。

您的第一個示例是參數化的,不易受SQL注入的影響。

參數化查詢不是簡單地由具有值的服務器替換(就像您可以手動用value替換@var )。 它們的發送和接收完全與您發送的一樣..與@valueFromApplication

服務器將解析查詢..當它到達變量時,它將查找提供的值。 如果該值為'' ; DROP DATABASE Foo -- '' ; DROP DATABASE Foo -- ..然后它成為它使用的 它不會解析它...它只是將它用作文本/數字/它是什么類型。

要添加有關Entity Framework的內容,它在內部使用Parameterised查詢,因此它也是SQL注入安全的。

參數不是簡單地在線替換到SQL中 - 它們是從查詢單獨發送到SQL Server的。

所以,SQL Server得到類似的東西:

Query:
   SELECT FirstName, LastName FROM Customers WHERE CustomerId = ?
Parameter 1:
   '' ; DROP DATABASE Foo --

因此,它編譯一個查詢,檢查CustomerId字面上等於'' ; DROP DATABASE Foo --的客戶'' ; DROP DATABASE Foo -- '' ; DROP DATABASE Foo -- 參數值永遠不會作為SQL執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM