1

私は次のコードを持っています:

$salt=uniqid(mt_rand(), false);
#Add data to tables
mysql_query("INSERT INTO accounts VALUES('$user', '".hash('sha512',$pass+$salt)."', '$salt', '$cookie_value')");
mysql_query("INSERT INTO passwordreset VALUES('$user', NULL, NULL)");
#cookie creation
#.....
#cookie update
mysql_query("UPDATE accounts SET cookie='$cookie_value' WHERE user='$user'");

これらの関数を使用して、フォームからデータをサニタイズします。

$var = htmlentities($var, ENT_QUOTES, "UTF-8");
return mysql_real_escape_string($var);

今日、phpMyAdmin にログインしたところ、すべてのユーザーのパスワードとソルトが同じであることがわかりました。非推奨の mysql_* について思い出させないでください。私はそれを知っています。それは簡単なドラフトです。

4

4 に答える 4

3

PHP の文字列連結では.notを使用し+ます。したがって:

hash('sha512',$pass+$salt)

する必要があります

hash('sha512',$pass.$salt) // or
hash('sha512',"${pass}${salt}")
于 2012-08-02T09:43:45.337 に答える
2

これは PHP です$pass+$salt$pass . $salt

于 2012-08-02T09:44:13.340 に答える
1

現在のコードについてコメントしたいことがいくつかあります。

  1. +2 つの文字列に対して ( ではなく) 演算子を使用する.と、両方の値の合計が整数にキャストされます (文字列が数値でない場合は、にキャストされますint(0))。に渡されるhash()と、再び文字列にキャストされるため、通常、パスワードはすべてsha512("0"). ただし、列のデータ型がデータベースにない限り、ソルトがすべて同じ値を持つ理由はわかりませんINT

  2. を使用uniqid(mt_rand(), true)してより多くのエントロピーを収集し、より良いソルトを得ることができます。

  3. BlowFish オプションなどの専用のパスワード ハッシュでパスワードをハッシュcrypt()する必要があります (列幅が十分に大きいことを確認してください)。このようにして、ソルト列を取り除くことができ、下位互換性のある方法でハッシュを検証するために必要な作業を選択できます。

  4. Cookie列は、自動ログイン機能用ですか?主キーとしてのランダム化された文字列とユーザー テーブルへの外部キーを含む別のテーブルを作成することをお勧めします。このようにして、複数のブラウザからの自動ログインをサポートできます。

于 2012-08-02T10:03:39.893 に答える
0

ここでエラー

$pass+$salt

する必要があります

$pass.$salt

. PHPの文字列連結に使用されます

于 2012-08-02T09:45:22.833 に答える