2012-12-17 44 views
1

我正在使用其他人生成的數據庫(並且我沒有真正授權對其進行更改)。然而,正如我一直在尋找到數據庫中的存儲過程,我注意到以下步驟:爲已存儲的MySQL數據庫過程輸入消毒

DELIMITER $$ 

CREATE PROCEDURE `logIn`(userName varChar(50), userPass varChar(50)) 
BEGIN 
    declare userID int; 

    SELECT 
    u.userID INTO userID 
    FROM 
    users u 
    WHERE 
    u.userName=userName 
    AND u.userPassword=MD5(userPass); 

    IF (IFNULL(uID,-1) > 0) THEN 
    select 1 as outMsg; 
    ELSE 
    select 0 as outMsg; 
    END IF; 
END$$ 

具有三列對應的表usersuserID INTuserName VARCHAR(50)userPassword VARCHAR(50)

因爲我不是很擅長這個,有人能讓我知道這樣一個函數的輸入是否需要消毒,因爲不允許任何SQL注入,如果不是 - 爲什麼?一般的經驗法則將非常感激。

P.S.這個函數將從表單提交的JS腳本中調用。

+0

該過程本身並不脆弱,因爲參數'uName'和'uPass'將被RDBMS正確處理,並且您沒有執行動態SQL字符串。但是,如何在代碼中調用procedure_可能會很脆弱......我們需要了解這一點。 –

+0

使用某些服務器端語言篩選器 –

+0

使用JavaScript清理輸入永遠不會安全。這必須在服務器上完成。 –

回答

1

這裏有幾條經驗法則,它取決於底層數據類型以及它如何插入到數據庫中。

首先,參數化查詢總是最好的SQL注入防護..但是..如果你不能改變的..

字符串類型:

  1. 刪除任何單引號 OR 用單引號替換任何單引號兩次。

  2. 將下列任何字符替換爲其編碼替代;

    • >
    • <
    • ;
    • (CHR 34)
    • 例如..)被替換爲&#X29;

      - (在上面的例子中的空間,所以你會看到代碼,刪除它得到「)」)

對於其他數據類型,然後串,檢查數據類型是理智並刪除不應該在數據類型中的任何字符。如果它是一個整數,確保你傳入的字符串是一個整數。這通常可以通過轉換爲代碼中的類型來完成。演員陣容將工作..或導致錯誤。檢查數據類型min和max還沒有被超過也是很好的。例如..如果我正在檢查一個整數,我可能會使用類似於此的代碼:

var myInt = parseInt(param);

然後,我可能會檢查它的界限,以確保它小於最大整數值並大於最小整數值。

這應該是足夠好,以防止SQL注入攻擊...

和..因爲你還沒有公佈,實際上與數據庫接口的代碼...作爲一個額外的預防措施..你也可以要刪除 - ,`,%,「,」,「」。

你只想'理智'的值進入數據庫調用..所以一個整數,如$ 309沒有意義,你想刪除$ ..。可能通過使用正則表達式替換任何非數字字符逗號和句點。 [^ [0-9 ,.]]

要格外小心。

+0

for php,follow:http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection –

+0

從我可以收集,上面的php使用mysqli簡單的事實應該足以確保查詢是安全的。我的結論是否正確? – YEAellyn

+0

否。對於這種情況,您必須綁定參數。 $ stmt = $ mysqli-> prepare(「INSERT INTO table(column)VALUES(?)」); // TODO檢查$ stmt創建成功 //「s」表示數據庫需要一個字符串 $ stmt-> bind_param(「s」,$ unsafe_variable); –

0

是的,輸入必須在嘗試運行該過程之前進行消毒。

您可能想要分享程序的實際呼叫點以獲得更多幫助,因爲無法直接從JS以表單提交提交。您可能有一個Servlet,PHP頁面或一些HTTP友好中介,以便以某種方式進行數據庫調用。

+0

我已經包含了調用的PHP頁面,之前我沒有注意到它實際上是從PHP代碼中調用的。不好意思,因爲我說我不擅長這個。 – YEAellyn