(设置场景)所以我的数据库中有一个表,其中包含用户密码(密码列),当他们插入新密码时,该表已通过触发器由 MD5 加密。此表还包含用户在其网站上发布的赞数(赞列)。该表还有一个触发器,可以在进行更新时对密码进行 md5。这样做是为了当用户编辑他们的个人资料时,他们可以更改他们的密码,并且需要再次加密。
(主要问题)我遇到的问题是,当其他用户单击帖子上的“赞”按钮时,它会更新用户喜欢添加的 1。问题是我的密码列然后再次被 md5 加密,我不想这样做发生。
(你可以做什么!)所以我希望有一种方法可以指定(在 mysql 中)触发效果的列。当类似列更新时,密码列中不应更改任何内容。但目前密码不断被加密。
任何帮助将非常感激!
我已经尝试通过 php 将密码设置为 null。然后从数据库中获取密码并再次插入!但它已经加密,因此当它返回数据库时,触发器会受到影响,md5 命令是在已经散列的密码上完成的。
这是我可以显示在触发器框中的唯一代码
SET NEW.Password = MD5(NEW.Password)
这是一个使用 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 的评论是一个很好的建议。有关在安全性 SX上使用 CRYPT 的更多信息。请注意,Crypt 将从 MySQL 8.0.3 中删除,并且它们没有加盐版本,因此如果要在触发器中创建保存密码,则需要滚动自己的盐和 SHA2。因此,在 PHP 中进行散列似乎是更安全的选择。
结合触发器和准备好的语句没有错。我不知道为什么有人会假设使用触发器意味着准备语句不在桌面上。始终使用准备好的语句。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句