2013-05-10 35 views
1

此存儲過程將檢查用戶名和密碼,如果憑據匹配則返回1否則0此存儲過程是否容易受到SQL注入?

CREATE PROCEDURE usp_CheckPermisssions 
    @UserName NVARCHAR(50), 
    @Password NVARCHAR(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF EXISTS(SELECT 1 FROM dbo.Users WHERE [email protected] and [email protected]) 
    RETURN 1 
    ELSE 
    RETURN 0 
END 
GO 

這只是一個示例存儲過程。我只是想了解SQL注入技術,以防止我的代碼不被注入。

假設輸入未在前端進行消毒。

我知道如果我在存儲過程中使用動態查詢或在前端定義了查詢,那麼SQL注入技術將起作用。

不是:輸入將通過前端。

我的問題換句話說

任何人都可以做這個查詢注入?如果是,如何?拇指

回答

0

第一條規則,以防止SQL注入是:

不串接您的查詢字符串的用戶輸入。

使用參數就像你在你的例子!

Btw。您的示例不起作用,因爲您只聲明 @變量而不指定任何值。應爲您的存儲過程f.e的參數 。

+0

爲什麼只有用戶輸入? – 2013-05-10 12:04:37

+0

因爲這是第一條經驗法則。還有更多:P – 2013-05-10 12:06:26

+0

爲什麼將一條規則分爲兩條?服務器源數據不能包含服務角色嗎? – 2013-05-10 12:07:39

5

SQL注入在存儲過程中很少發生。爲了實現這一點,您需要在該過程中動態創建查詢。

它通常是調用SQL注入存儲過程的代碼。當您通過連接值創建查詢而不正確編碼它們時,可以使用SQL注入來突破該值並將代碼注入查詢。危險代碼

例子:

string userName = Request.Form("username"); 
string password = Request.Form("password"); 

int ok; 
using (SqlConnection conn = new SqlConnection(connStr)){ 

    // parameters are not encoded correctly, so totally open to SQL INJECTION! 
    string query = "usp_CheckPermissions '" + userName + "', '" + password + "'"; 

    using (SqlCommand cmd = new SqlCommand(query, conn)) { 
    cmd.CommandType = CommandType.Procedure; 
    ok = cmd.ExecuteScalar(); 
    } 
} 

如果您的密碼';drop table Users;--,這將是壞登錄...

0

微軟對SQL注入一些有用的documentation。因爲它解釋,有兩種情況:

  • 輸入被立即與其它代碼連接起來並執行
  • 的輸入端被直接保存到一個表和以後檢索,與其它代碼連接起來並執行

由於在此過程中沒有連接(動態SQL),因此它本身很安全。但是,如果其他完全不同的代碼在後面連接這些值,理論上可能會有問題。

問題是,在大多數系統中,';drop table Users;--是一個完全有效的密碼,因爲一般來說密碼不應該由系統檢查。所以有人可能會輸入它作爲密碼,希望以後它將被連接並執行。

這都意味着您需要隨時隨地在所有代碼中使用參數。如果某些數據完全處於用戶的控制之下 - 比如密碼 - 那麼即使在輸入數據後,您也需要確保您能正確處理它們。

相關問題