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

詹姆斯·克拉克

(设置场景)所以我的数据库中有一个表,其中包含用户密码(密码列),当他们插入新密码时,该表已通过触发器由 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有办法在mysql中查找具有相同列的行

有没有办法重置MySQL中的所有配置?

有没有办法使用php从mysql列中获取注释?

R 中有没有办法在 MySQL 的数据框中散列密码?

有没有办法在MySQL更新查询中使用变量

有没有办法优化这个 mysql 查询(更新、多个连接)?

有没有办法将数据从 ldap 服务器传输到 MySQL(或 Elasticsearch)?

有没有办法解决node.js中的mysql重新连接问题?

有没有办法在MySQL中获取自动提交的默认值?

有没有办法在mysql中编辑Information_schema

有没有办法在MySQL中检索数据类型的最小值?

有没有办法知道您当前在mysql中的用户名?

有没有办法使用MYSQL在CASE语句THEN节中做很多事情?

有没有办法在 php 文件中启用 pdo_mysql?

有没有办法像这样在 MySQL 中显示数组?(“一”=>“1”)

有没有办法丰富MySQL中的JSON字段?

有没有办法在mysql数据库中插入带有前缀的自动增量主ID?

有没有办法在mysql中的两个表中的不同列之间执行多次查找?

有没有办法让 MySQL 中的特定列只允许 INSERT,而不允许 UPDATE 或 DELETE?

有没有办法在不事先知道值的情况下用php更新mysql表?

有没有办法跟踪Web应用程序在mysql服务器中进行的调用?

有没有办法在sql server中获取触发器ID?

有没有办法终止触发器中的插入查询?

有没有办法在MariaDB 10.4.7中从mysql-connector-python使用'pool_reset_connection'?

当按 FIELD 排序时,有没有办法对 MySQL 中的两个行值赋予相等的权重?

有没有办法通过单击在 Blazor 中触发两个连续事件?

有没有办法通过引用传递属性或字段以在函数中更新它?

有没有办法通过引用传递属性或字段以在函数中更新它?

有没有办法通过破折号中的滑块更新间隔?