如何使用存储的函数安全地检索sql数据

时间:2016-04-23 20:06:20

标签: mysql sql-injection dynamic-sql stored-functions

我试图在MySQL中编写一个函数来获取作为参数给出的用户名的密码,同时避免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错误:

  

错误代码:1336。存储函数或不允许使用动态SQL   触发

我已经在网络上找到了涉及CONCAT的解决方案,但这意味着容易受到SQL注入攻击,我显然不希望这样。

我能做些什么吗?或者还有其他适当的方法来处理这种情况吗?

1 个答案:

答案 0 :(得分: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 $$