0

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

if ($usernamelogin == $dbusername && $passwordlogin == $dbpassword)
{
    $hash = md5(time());
    mysqli_query($connection, "UPDATE users SET sessionid='$hash' WHERE username='$usernamelogin' AND password='$passwordlogin'");
    $_SESSION['id'] = $hash;
    $_SESSION['un'] = $usernamelogin;
}
else 
{
    echo ('Wrong username or password.');
}

次に、$sessionid、SQL セッション ID、およびユーザー名を使用して、ユーザーが本物かどうかを確認します。これは、SQL インジェクションから保護されていると仮定すると、セキュリティ リスクが比較的少ないということですよね?

これは複雑な問題に対する非常に単純な解決策のように思えるので、ここに尋ねに来ました。私が行ったことのあるすべてのドキュメントと Web サイトは、ユーザーがログインしているかどうかを確認するための、はるかに複雑で紛らわしく、時には安全でない方法を実装していました。

これは安全ですか?

4

2 に答える 2

1

セッション ID の生成には使用md5(time())しないでください。これは安全ではありません。時間はライナーであり、推測可能です。たとえば、一部の Web サイトでは、ユーザーがログインしたときに表示されます。この情報とブルート フォースを使用して、セッション ID を乗っ取ることができます。

第二に、ランダムな時間にブルートフローズすることもでき、ランダムなユーザーセッション ID を取得できる可能性が高くなります。また、2 人のユーザーが同時にログインすると、2 人のユーザーが同じセッション ID を持つ可能性が高くなります。

この素晴らしい講演 ( DEFCON 18: How I Met Your Girlfriend 1/3 ) を見てください。私はそれを長い間見ています。詳細は思い出せませんが、講演者がセッションの弱点についてシリーズで指摘したことは覚えています。また、OWASP wikiも参照してください。Web セキュリティとセッション セキュリティに関する優れたリソースがあります。

于 2013-08-25T12:50:18.770 に答える