1

ユーザー名が無効であるか、パスワードが間違っているかに関係なく、同じ出力を返す次のクエリを検討してください (ほんの一例です。SQL インジェクションについて知っています)。

CREATE TABLE users (
    username VARCHAR(64),
    password CHAR(40)
);

SELECT FROM users
      WHERE username = '{$username}'
        AND password = sha1('{$password}');

ソルト フィールドを追加したいのですが、それを取得してアプリケーションで連結するのではなく、MySQL がエンジンで連結することをお勧めします。

CREATE TABLE users (
    username VARCHAR(64),
    salt VARCHAR(128),
    password CHAR(40)
);

SELECT FROM users
      WHERE username = '{$username}'
        AND password = sha1(CONCAT(<salt_field>, '{$password}'));

何と交換<salt_field>しますか?

4

1 に答える 1

1

任意の列を参照できます。この場合、 を使用できますWHERE password = SHA1(CONCAT(salt, <password>))。パスワードは盗聴される可能性があることに注意してください。環境を信頼するかどうかはあなた次第です。次のクエリは良い例ですが、あまり役に立ちません: WHERE lastName = username. この場合、ユーザーの姓とユーザーが選択したユーザー名を比較します。したがって、この場合、姓と同じユーザー名を持つすべてのユーザーが返されます。

これは、複数のテーブルを結合する場合にも発生します。実際、最初のテーブルのすべての行を 2 番目のテーブルの行と結合しますが、指定された基準に一致する行のみを返します。巧妙な最適化では、考えられるすべての組み合わせを考慮するのではなく、その一部のみを考慮することになります。

于 2013-02-24T11:25:50.423 に答える