1

私は問題があります。

私は新人プログラマーです。約 1 年前に、アプリケーションを作成するために独力で php を学び始めました。

すべての新人同様、アプリケーションを立ち上げた後に気付いた大きな間違いをいくつか犯しました。

外部キーが見つからない、暗号化されていない Cookie に保存されているパスワードなど....などなど。

あなたが私を判断する前に、私はアプリケーションが動作するようになりました。アプリケーションがうまくいくとは思っていませんでした.500ユーザーをはるかに下回ると予想していました。

1 年後、25,000 人のユーザーを獲得した今、私は窮地に立たされています。元のコードを改善し、必要なセキュリティの改善をすべて行い、2.0 バージョンをリリースする準備ができています。

問題は、パスワードがプレーンテキストで mysql に保存されていることです。2.0 バージョンを起動した後、パスワードはソルト化され、sha256 化されます。問題は、既存のレコードを更新して、それらをスラットして暗号化できるようにする方法です。

mysql から各パスワードを取得し、スクリプトを実行してデータベースに再度保存する必要があります。それを行う最良の方法は何ですか?

前もって感謝します。

4

2 に答える 2

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
    }
?>

現在、25,000 人のユーザーがいる場合は、時間をずらした方がよいかもしれません。ユーザーにIDが割り当てられていると仮定します..「select * from users where id < 0 and id > 1000」と条件の数字を増やして、すべてのユーザーを通過させます。

于 2012-07-31T21:34:21.060 に答える
1

まず、本番環境で実行する前に開発マシンでこれらすべてを試してください。また、本番環境で実行する前にデータベースをバックアップしてください。このような移行スクリプトは、データを失う最も簡単な方法です。

1)データベースに(タイプのENUM)フィールドを作成し、パスワードフィールドの暗号化のタイプを示します。デフォルト値を「暗号化されていない」に設定します

これがなく、何らかの理由で更新スクリプトが失敗した場合は、ハーフハッシュのデータベースが残ります。

どうやってするか:

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

2)暗号化されていないパスワードを1つ検索し、それをハッシュ/ソルト/保存するphpスクリプトを作成します。

<?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毎分起動します。データベース全体がハッシュされるまでそのままにしておきます。

私はあなたのデータベースにあるものの名​​前についていくつかの仮定をしたことに注意してください。

于 2012-07-31T22:13:22.790 に答える