据我所知,MySQL(及其变体(中有3种机制可以用来更新用户密码。
ALTER USER 'user'@'host' IDENTIFIED BY 'pw';
SET PASSWORD FOR 'user' = PASSWORD('pw');
UPDATE mysql.user SET authentication_string = PASSWORD('pw') WHERE User = 'user' AND Host = 'host';
其中,只有#3可以使用准备好的语句执行。
从MariaDB 10.4开始,mysql.user
表现在是一个视图,因此这种机制将不起作用,而且在任何情况下,扰乱mysql
数据库都会让人感到非常棘手。
#1和#2很容易受到SQL注入攻击,因为它们无法准备,因此问题是:
有没有一种安全的方法来更新MySQL用户的密码?
如果使用PDO,请使用PDO::quote()
对密码进行转义。
如果使用MySQLi,请使用mysqli_real_escape_string()
。
在mariadb 10.4中,您需要使用前两种方法来更改密码。
因为他们现在有不同的身份验证插件,并将密码存储在global_priv中,而不是user表中。
建议仅通过localhost执行,避免通过TCP并禁用历史记录。