(场景设置) 因此,我的数据库中有一个表,其中保存用户密码(密码列),当用户插入新密码时,该密码已通过触发器通过 MD5 进行加密。该表还保存用户在其网站帖子上的点赞量(点赞列)。该表还有一个触发器,用于在进行更新时对密码进行 md5 验证。这样做是为了当用户编辑他们的个人资料时,他们可以更改他们的密码,并且需要再次加密。
(主要问题) 我遇到的问题是,当其他用户单击帖子上的“赞”按钮时,它会更新用户喜欢添加 1。问题是我的密码列随后再次进行 md5 加密,这是我不希望发生的情况。
(你能做什么!) 所以我希望有一种方法可以指定(在mysql中)触发效果的列。当类似列更新时,密码列中不应更改任何内容。但目前密码一直在加密。
任何帮助将不胜感激!
我尝试通过 php.ini 将密码设置为 null。然后从数据库中获取密码并再次插入!但它已经加密,因此当它返回到数据库时,触发器就会生效,md5 命令是对已经散列的密码执行的。
这是我可以在触发框中显示的唯一代码
设置新密码 = MD5(新密码)
最佳答案
这是一个使用 CRYPT 的版本,并且以 $6$
开头的种子生成带种子的 SHA512。
DELIMITER //
CREATE TRIGGER `before_update_user` BEFORE UPDATE ON `user`
FOR EACH ROW BEGIN
if ( OLD.Password != NEW.Password ) then
-- password has changed, encrypt
SET NEW.Password = ENCRYPT(NEW.Password, CONCAT('$6$', SHA2(RANDOM_BYTES(64), '256')));
end if;
END
//
关于不使用 MD5 的评论是一个很好的建议。更多关于using CRYPT on security SX 。请注意,Crypt 将从 8.0.3 起从 MySQL 中删除,并且它们没有加盐版本,因此如果您想在触发器中保存密码,则需要滚动自己的盐和 SHA2。因此,在 PHP 中进行哈希处理似乎是更安全的选择。
组合触发器和准备好的语句没有任何问题。我不知道为什么有人会认为使用触发器意味着准备语句不可行。始终使用准备好的语句。
关于php - 有没有办法通过mysql中的触发器指定更新哪些列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57012978/