2016-04-23 127 views
0

我正在嘗試在MySQL中編寫一個函數,該函數獲取用戶名的密碼作爲參數,同時避免SQL注入。如何使用存儲函數安全地檢索sql數據

這裏是我的代碼:

CREATE FUNCTION get_password_for_user (p_username varchar(30)) 
    returns varchar(32) 
BEGIN 
    declare passwd varchar(32) default ""; 

    PREPARE stmt FROM 'select password into @passwd from users where name=?'; 
    SET @name = p_username; 
    EXECUTE stmt USING @name; 
    DEALLOCATE PREPARE stmt; 

    return passwd; 
END $$ 

當我嘗試創建它,它提供了動態SQL錯誤:

Error Code: 1336. Dynamic SQL is not allowed in stored function or trigger

我發現在網絡上涉及CONCAT解決方案,但會意味着很容易受到SQL注入的攻擊,我顯然不希望這樣做。

我能做些什麼嗎?或者有沒有其他適當的方法來處理這種情況?

+1

使用處理注入的框架(即調用函數)。不要使用動態sql來處理它。 –

回答

1

爲什麼使用動態sql?

CREATE FUNCTION get_password_for_user (p_username varchar(30)) 
    returns varchar(32) 
BEGIN 
    declare passwd varchar(32) default ''; 

    select passwd := u.password 
    from users u 
    where u.name = p_username; 

    return passwd; 
END $$ 
+0

如果p_username包含SQL注入語句會怎麼樣? – conectionist

+0

@conectionist。 。 。你看起來很困惑。您無法注入非動態SQL。 'p_username'將被視爲一個字符串,而不管字符串中是否有奇怪和奇怪的字符。 –

相關問題