【问题标题】:MYSQL: Procedure with if statementMYSQL:带有 if 语句的过程
【发布时间】:2011-11-25 21:17:23
【问题描述】:

我正在尝试创建一个首先检查用户密码的例程,如果正确,它将从不同的表中返回一些值或连续更改一些值。

如果不进行您在 PHP 中处理的两个查询,这是否可能?首先调用密码,检查是否正确,然后允许用户更改名称。

这里是使用电子邮件和密码获取用户行的示例。

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_user_info`(
    IN in_Email VARCHAR(45),
    IN in_Pass VARCHAR(45)
    )
BEGIN
    SELECT * FROM User WHERE Email = in_Email AND Pass = in_Pass;
END

这就是我目前所得到的:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
    in_Email VARCHAR(45),
    in_PassOld VARCHAR(45),
    in_PassNew VARCHAR(45)
)
BEGIN
    SET @PassOld = (SELECT Pass From User WHERE Email = in_Email);

    IF(@PassOld = in_PassOld) THEN
        UPDATE User SET Pass = in_PassNew WHERE Email = in_Email;

    END IF;

ENDND IF;
END

感谢大家的帮助!

【问题讨论】:

标签: mysql stored-procedures if-statement


【解决方案1】:

你真的应该散列这些密码,使用下面的代码

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
    in_Email VARCHAR(45),
    in_PassOld VARCHAR(45),
    in_PassNew VARCHAR(45)
)
BEGIN
  DECLARE KnowsOldPassword INTEGER;

  SELECT count(*) INTO KnowsOldPassword 
    FROM User 
    WHERE Email = in_Email AND passhash = SHA2(CONCAT(salt, in_PassOld),512);
  IF (KnowsOldPassword > 0) THEN
    UPDATE User 
      SET Passhash = SHA2(CONCAT(salt, inPassNew),512) 
      WHERE Email = in_Email;
  END IF;
END $$

DELIMITER ;

salt 是表user 中的一个额外字段,它或多或少是随机的,但不需要保密。它有助于击败rainbow tables
您可以将 salt 设置为短字符串 char(10) 或随机数据。例如

salt = ROUND(RAND(unix_timestamp(now())*9999999999);

你不需要更新salt,只需生成一次,然后存储即可。

有关此问题的更多信息,请参阅:
Salting my hashes with PHP and MySQL
How should I ethically approach user password storage for later plaintext retrieval?

对您的代码的评论

IF(@PassOld == in_PassOld) THEN  //incorrect 
IF(@PassOld = in_PassOld) THEN   //correct, SQL <> PHP :-)

【讨论】:

  • 通行证已经加盐了。例程是为我准备的 :) 所以我知道怎么写。
  • 我试图去掉盐的东西,只用 IF 语句,但它对我不起作用
  • 在完成存储过程后不要忘记设置delimiter ;,否则if不会运行,因为它使用了错误的分隔符。
猜你喜欢
  • 2015-01-17
  • 1970-01-01
  • 2015-04-22
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多