【发布时间】:2015-04-25 14:15:26
【问题描述】:
我有一个 mysql 表,其中包含 userid、password、hashedpassword 列。我曾经将密码作为纯文本存储在密码列中。我现在意识到这是不可接受的,并且现在想对所有这些进行散列并将它们以正确的方式存储在 hashedpassword 字段中。
你会对下面的脚本生气,因为它的效率低得可怕。正如您可能猜到的那样,它在我的服务器上超时。有人可以帮助一个明显缺乏经验的程序员以正确的方式更新数据库中的所有这些字段吗?清楚地为每条记录连接到数据库是愚蠢的:(...
$sql = "SELECT *
FROM users";
$result = mysqli_query($connection, $sql);
if (!$result) {
die("Database query failed: " . mysqli_error($connection));
} else {
while ($row=mysqli_fetch_array($result)) {
$userid=$row['userid'];
$passwordhashed=password_hash($row['password'], PASSWORD_DEFAULT);
$sql = "UPDATE users
SET hashedpassword='$passwordhashed'
WHERE userid='$userid'
LIMIT 1";
$update = mysqli_query($connection, $sql);
if (!$update) {
die("Database query failed: " . mysqli_error($connection));
} else {
//we good
}
}
}
【问题讨论】:
-
为什么必须同时出现?您可以分别执行多个更新,我认为它会更有效。有什么理由应该马上?
-
很可能这只是一次性的事情,所以只需用他们的密码、哈希和每一个循环用户,然后创建一个 sql 字符串或一个文件,然后在终端中执行它
-
它是一次性工作,不管需要多长时间
-
“为每个记录清楚地连接到数据库是愚蠢的”你不这样做,你做一个选择然后每个用户更新一次,所有这些都使用一个连接。这是正确的
-
不要通过网络服务器运行长时间运行的作业!通过 SSH 或其他方式登录您的服务器,然后在命令行上运行
$ php update_all_passwords.php。那里没有超时(通常)。如果您不知道我刚刚写的任何内容是什么意思,那么是时候弄清楚了。 :o)