2016-04-23 140 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'将被视为一个字符串,而不管字符串中是否有奇怪和奇怪的字符。 –

相关问题