一个接一个地更改所有mysql条目...纠正菜鸟错误

时间:2012-07-31 21:29:20

标签: php security passwords

我有一个问题。

我是菜鸟程序员,大约一年前我开始自己学习php来编写应用程序。

像所有新手一样,我在应用程序启动后发现了一些重大错误。

缺少外键等未加密的cookie存储密码....等等。

现在,在你判断我之前,我得到了应用程序,我还没有预料到应用程序,并且预计远低于500个用户。

现在一年和25k用户后来我发现自己处于绑定状态,我已经改进了原始代码,进行了所有必要的安全性改进以及什么不是,我准备启动2.0版本。

问题是密码以纯文本形式存储在mysql中。在我启动2.0版本后,密码将被盐渍并且sha256。问题是如何更新现有记录,以便我可以对它们进行板条和加密。

我需要从mysql中提取每个密码,然后通过脚本运行它并再次将它们保存回数据库。什么是最好的方法呢?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

这里没有什么神奇之处。您可以编写一段PHP代码来执行更新过程。基本上你要做的是......

<?php
    select * from users
    for each (user row in database) {
        work on 'password' to get 'new password'
        update users set password='new password' where id=id
    }
?>

现在有25k用户你可能希望错开它......也许每次做1000次。我假设你已经为你的用户分配了ID。所以只需“选择*来自id&lt; 0和id&gt; 1000的用户”并在条件中增加数字以通过所有用户。

答案 1 :(得分:1)

首先,在开始生产之前在开发机器上尝试所有这些东西,并在生产之前备份数据库。像这样的迁移脚本是丢失数据的最简单方法。

1)在数据库(类型为ENUM)中创建一个字段,说明密码字段的加密类型。将默认值设为“未加密”

如果您没有这个,并且更新脚本由于某种原因失败,您将留下半散列数据库。

如何做到这一点:

ALTER TABLE application.users
 ADD password_type ENUM('unencrypted', 'SHA256') NOT NULL;

2)创建一个php脚本,查找1个未加密的密码,并使用hashs / salts /存储它。

<?php

mysql_connect("hostname", "user", "pass") or die(mysql_error());
mysql_select_db("application") or die(mysql_error());

// Get all the data from the "example" table
$result = mysql_query("SELECT * FROM users WHERE password_type = 'unencrypted'")
or die(mysql_error());

// keeps getting the next row until there are no more to get
$row = mysql_fetch_array( $result );

$pw = $row['password'];
$id = $row['user_id_num'];
$id = (int) $id;

$hashed_password = hash("sha256", $pw);

mysql_query("UPDATE users SET password_type = 'SHA256' AND SET password = '$hashed_password' WHERE user_id_num = $id")
or die(mysql_error());


?>

3)更改该脚本,例如,每次更改100个。

4)每分钟使用linux工具cron启动脚本。保留它直到整个数据库被散列。

请注意,我已经对数据库中的内容名称做了一些假设。