Lin*_*qan 2 mysql stored-procedures if-statement
我正在尝试创建一个首先检查用户密码的例程,如果它是正确的,它将从不同的表返回一些值或更改一行中的某些值.
如果没有在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
Run Code Online (Sandbox Code Playgroud)
这就是我到目前为止所得到的:
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
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助!
您应该真正散列这些密码,使用以下代码
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 ;
Run Code Online (Sandbox Code Playgroud)
该salt是在表中的额外字段user是或多或少随机的,但不必是秘密的.它有助于击败彩虹桌.
您可以将salt设置为短字符串char(10)或随机数据.例如
salt = ROUND(RAND(unix_timestamp(now())*9999999999);
Run Code Online (Sandbox Code Playgroud)
您不需要更新salt,只需生成一次然后存储它.
有关此问题的更多信息,请参阅:
使用PHP和MySQL保存哈希值
我应如何合乎道德地接近用户密码存储以便稍后检索明文?
对您的代码发表评论
IF(@PassOld == in_PassOld) THEN //incorrect
IF(@PassOld = in_PassOld) THEN //correct, SQL <> PHP :-)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37673 次 |
| 最近记录: |