php - 有没有办法通过mysql中的触发器指定更新哪些列?

标签 php mysql sql

(场景设置) 因此,我的数据库中有一个表,其中保存用户密码(密码列),当用户插入新密码时,该密码已通过触发器通过 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/

相关文章:

php - 模块 'PDO' 已加载到未知行 0

php - 如何使用 imagick for php (imagemagick) 设置像素的颜色?

php - Laravel 5 PDF页脚与 Blade 显示空白

mysql - 无法在我的数据库上运行特定的 SQL 查询

Java 从 SQL 数组获取结果集失败

sql - 如何按 ISO 周排序并从今天的周数开始

php - 保护我的 PHP 页面免受未经授权的查询

mysql - 如何将嵌入式 mysql 查询简化为 JOIN?

java - 将 jOOQ 与 Google Cloud SQL 结合使用

php - Codeigniter 使用 join 进行搜索