我正在尝试制定一个例程,首先检查用户密码,如果正确,它将从不同的表返回一些值或连续更改一些值。
如果不进行在 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
感谢您的帮助!
您确实应该对这些密码进行哈希处理,使用以下代码
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 ;
The salt
是表中的额外字段user
这或多或少是随机的,但不需要保密。它的作用是打败彩虹桌 http://en.wikipedia.org/wiki/Rainbow_table.
您可以将 salt 设置为短字符串 char(10) 或随机数据。例如
salt = ROUND(RAND(unix_timestamp(now())*9999999999);
您不需要更新盐,只需生成一次然后存储即可。
有关此问题的更多信息请参阅:
使用 PHP 和 MySQL 对我的哈希值加盐 https://stackoverflow.com/questions/3273293/salting-my-hashes-with-php-and-mysql
我应该如何合乎道德地处理用户密码存储以便以后进行明文检索? https://stackoverflow.com/questions/2283937/how-should-i-ethically-approach-user-password-storage-for-later-plaintext-retriev
对您的代码的评论
IF(@PassOld == in_PassOld) THEN //incorrect
IF(@PassOld = in_PassOld) THEN //correct, SQL <> PHP :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)