2011-01-19 15 views
1

基本的に、私は自分のPHPログインコードで何かを変更しました。そして今、ログインすると、MySQLはケースが一致するように要求しますか?mysqlとphpは突然大文字と小文字を区別しますか?

$match = "select * from users where username = '".$username."' and password = '".$password."';"; 

    echo $match; 

私のユーザー名のCaSeがデータベースと一致しない場合は、どの行も返されません。

ユーザーがADMINとして登録すると、「admin」や「AdMiN」などのアイデアでログインできるようになりますか?

多くのありがとう:)

+5

'username'の照合とは何ですか? –

+0

何を変更しましたか? –

答えて

8

その列の照合順序が変更されています。詳細については、this MySQL page about case sensitivity in string comparisonを参照してください。そのような問題から身を守るために、

$match = "select * from users where UPPER(username) = '".strtoupper($username)."' and password = '".$password."';"; 

は通常のトリックです。しかし、他の人が見てきたように、照合がデータベース内でどのように機能し、それを適切に使用するかを理解することが最良の解決策です。データベースの照合順序を正しく取得し、それに頼ることで、テーブルをスキャンするのではなく、データベースがユーザー名列のインデックスを使用できるようにする必要があります。

また、SQL injectionの攻撃を回避していることを確認してください。ユーザーが一重引用符を含むユーザー名を入力した場合、現在のコードはどうなりますか?

ユーザー名として使用できる文字と使用している文字セットを考慮する必要があります。有効なユーザー名は "René"ですか?フロントエンドからデータベースを通って文字セットの問題に悩まされることなく、正常に終了しますか? Joel Spolskyのexcellent article on Unicodeは、ある時点ではおそらく読んだだけの価値があります。

+1

パフォーマンス上の理由から、照合順序が正しいことを確認することをお勧めしますが、テーブルを変更できない場合、あなたのソリューションは悪い設計を修復する良い方法です。) –

+1

@Davidはい、絶対にあります。 D –

+1

'... WHERE username = '" $ username "' COLLATE utf8_general_ci'はもう少し洗練されていて、クエリでインデックスを使用できるようになっています。 (もちろん必要な照合を使用してください) – Mchl

関連する問題