2011-10-24 7 views
15

私はいくつかのテストを行っていました。テーブルにクエリを実行すると驚きました。クエリSELECT * FROM table WHERE email=0はテーブルからすべての行を返しました。フィールド= 0の場合、mySQLはすべての行を返します。

この表には「0」という値はなく、通常の電子メールが入力されています。

これはどうしてですか?これは深刻なセキュリティ上の問題につながります。

クエリを変更せずにこれを回避する方法はありますか?

ここに何か不足していますか?

ありがとうございました。

答えて

21

これは電子メールフィールド(私はvarcharフィールドと仮定します)を整数に変換するためです。有効な整数がないフィールドはすべて0になります。文字列フィールドを文字列値と比較するだけでよいことを確認する必要があります(日付と比較して同じ)。クエリは次のようにする必要があります。

SELECT * FROM table WHERE email='0'; 
+3

思いますか?私はこれがバグを導入しやすい場所だと思います。私は、なぜ文字列を0に変換するような変換変換を行わないようにする必要があるのか​​を知ることはできません.0を0に変換する方が良いのはなぜですか? –

6

あなたemail列はCHARまたはVARCHARタイプです。条件email = 0を使用すると、MySQLはemailカラムの内容を整数にキャストして、指定したカラムと比較します。 0を引用符で囲んだ場合、クエリは期待通りに機能します。あなたは数値文字列と同じことをしようとした場合(email = '0'

は、対照的に0

mysql> SELECT CAST('[email protected]' AS SIGNED); 
+-------------------------------------+ 
| CAST('[email protected]' AS SIGNED) | 
+-------------------------------------+ 
|         0 | 
+-------------------------------------+ 

になりますMySQLでの整数に数値以外の文字列を変換する、彼らは正確に唱えてもよい:

あなたは電子メールの欄が空白または空すべきでないすべてのレコードを取得したい場合
mysql> SELECT CAST('12345' AS SIGNED); 
+-------------------------+ 
| CAST('12345' AS SIGNED) | 
+-------------------------+ 
|     12345 | 
+-------------------------+ 
-1

、あなたが使用することができます

SELECT * FROM table WHERE email IS NOT NULL; 
3

電子メールフィールドはおそらく文字で、数値と一致しています。

で試してみてください

、あなたはmysqlはこの方法で作業する必要があることを

SELECT * FROM table WHERE email='0'; 
関連する問題