3

私は現在学校のプロジェクトに取り組んでいますが、最近、ログイン認証の完了に向けて進展がありません。HASHとSALTを使用して新しいユーザーを登録しています。自分に合ったリソースが見つからないので、ここでアカウントを作成して、自分自身の質問をすることにしました。

これは私の登録スクリプトです:

    $username = $_POST['username'];
    $email = $_POST['email'];
    $first = $_POST['fname'];
    $last = $_POST['lname'];
    $salt = crypt("sha512", false);
    $pass = $_POST['password'];
    $password = hash("sha512", $salt . $pass . $salt, false);

$sql = "INSERT INTO `users` (`username`, `email`, `fname`, `lname`, `salt`, `password`) VALUES ('$username', '$email', '$first', '$last', '$salt', '$password')";

次に、ログインページであるインデックスページにaction="checklogin.php"であるchecklogin.phpスクリプトがあります。これは完全なスクリプトです:http://pastebin.com/tKrsHaFU(ペーストビン)

私の質問は、index.phpページ(ログインフォーム)にアクセスしたユーザーを、データベースに既に存在するユーザーとどのように検証するかです。パスワードにはソルトとハッシュがあることに注意してください。

4

3 に答える 3

5

初めに:

$salt = crypt("sha512", false);

これにより、静的ソルトが生成されます。つまり、バリエーションはありません。より良いものを生成するには:

$salt = uniqid(mt_rand(), true); // the paranoid use openssl_random_pseudo_bytes()

レコードを検証するために、SQL は次のようになります。

$sql="SELECT * FROM $tbl_name WHERE username='$myusername'";
$result=mysql_query($sql);
// ...
if ($count==1) {
    $row = mysql_fetch_assoc($result);
    if (hash('sha512', $row['salt'] . $_POST['mypassword'] . $row['salt']) == $row['password']) {
        // validation passed, rejoice!
    }
}

ただし、ここを見る必要があります: How do you use bcrypt for hashing passwords in PHP?

于 2012-12-16T14:39:15.197 に答える
0

そんなに心配する必要はありません!!

ログインスクリプトの背後にある基本的な考え方と、ユーザー情報を格納するデータベースの背後にある基本的な考え方は、各ユーザーを一意に識別する主キーとして最低1つの値が必要であるということです。今あなたの場合、そのaptはusername主キーのようです。

だからあなたがする必要があるのは単に実行することです$data = mysql_query("SELECT * FROM table_name") or die(mysql_error());

table_nameこれは、すべてのユーザー情報を格納するテーブルの名前になります。これで、$info = mysql_fetch_array( $data );すべてのユーザー情報が配列に入れられます。

単純なvar_dump($info)ものは、ユーザーの他の詳細とともにすべてのユーザー名を一覧表示します(単にテスト目的で...ユーザーが登録するときにdis情報を表示したくない:P)

この配列をループして、new_userによって提供されたユーザー名を配列にすでに存在するユーザー名と一致させます。一致する場合は、と言うことで彼を止めることができますUser already exists !!。そうでなければ、あなたのウェブサイトに彼を歓迎します。

于 2012-12-16T14:25:30.450 に答える
0

この記事が読める方はご覧ください。一般的な設計パターンを示します。 http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_2391-PHP-login-logout-and-easy-access-control.html

それだけの作業ができるようになったら、次のステップはデータベース内のパスワードを隠すことです。php md5()を使用して、パスワードの一方向エンコーディングを作成できます。クライアントが登録するときにmd5()をパスワードに適用し、エンコードされたパスワードを保存します。クライアントがログイン フォームに入力する平文パスワードにmd5()を適用します。SELECT クエリでエンコードされたパスワードを使用します。ソルト文字列を md5() 関数呼び出しに連結できます。必ず同じ塩を毎回使用してください。

http://php.net/manual/en/function.md5.php

宜しくお願いします、〜レイ

于 2012-12-16T14:31:35.827 に答える