回答編集履歴

2 追記

tanat

tanat score 13338

2016/07/20 16:28  投稿

ソースコードの提示ありがとうございます。
> require ('mysql_connect.php');
はおそらく、mysql_connect()でmysqlに接続しているだけと仮定します。
回答とは関係ありませんが、重要なので先に2点、
**mysql_* 系の関数は古くて非推奨になっているので、使わないほうがいいです。**
**また、現在のソースコードには深刻なSQLインジェクション脆弱性を抱えているので修正の必要があります。
具体的には攻撃者は任意のユーザに成りすましてログインすることが可能なコードになっています。**
おそらく古い参考書やサイトを参考にされたかと思いますので、ここ1-2年くらいのサイト/参考書を参考にしなおされるのがいいかと思います。
質問に対する回答としては
```
select * from users_info where mail='petrov@t-answer.jp' AND password=''
```
これはSQL文としては正しいので、
```PHP
$sql_query = mysql_query("select * from users_info where mail='" . $mail . "' and password='" . $pass . "'");
```
$sql_queryには結果セットが返却されます。
そのため、
```PHP
if($sql_query)
```
は常にtrueになります。
これを回避するには、$sql_queryをfetchした結果がfalseになるか、
``` select count(*) from ```
のようなSQLにして、結果をfetchして件数が一件であることを確認するというのがよくある方法です。
のようなSQLにして、結果をfetchして件数が一件であることを確認するというのがよくある方法です。
今回試みようとされている
「ユーザの入力によって不正なSQL文が作られてしまうことを利用してエラーハンドリングを行う」
というアプローチは、そのままSQLインジェクション脆弱性を作りこんでしまう事になってしまうため、
ユーザが完全に信頼できる場合(例えばphpMyAdminの様に管理者以外は触らないことを前提にする場合)を除いては
**セキュリティ上絶対にやってはいけないアプローチ**
となります。
1 強調表示を修正

tanat

tanat score 13338

2016/07/20 16:25  投稿

ソースコードの提示ありがとうございます。
> require ('mysql_connect.php');
はおそらく、mysql_connect()でmysqlに接続しているだけと仮定します。
回答とは関係ありませんが、重要なので先に2点、
**mysql_* 系の関数は古くて非推奨になっているので、使わないほうがいいです。
また、現在のソースコードには深刻なSQLインジェクション脆弱性を抱えているので修正の必要があります。
具体的には攻撃者は任意のユーザに成りすましてログインすることが可能なコードになっています。
**
**mysql_* 系の関数は古くて非推奨になっているので、使わないほうがいいです。**
**また、現在のソースコードには深刻なSQLインジェクション脆弱性を抱えているので修正の必要があります。
具体的には攻撃者は任意のユーザに成りすましてログインすることが可能なコードになっています。**
おそらく古い参考書やサイトを参考にされたかと思いますので、ここ1-2年くらいのサイト/参考書を参考にしなおされるのがいいかと思います。
質問に対する回答としては
```
select * from users_info where mail='petrov@t-answer.jp' AND password=''
```
これはSQL文としては正しいので、
```PHP
$sql_query = mysql_query("select * from users_info where mail='" . $mail . "' and password='" . $pass . "'");
```
$sql_queryには結果セットが返却されます。
そのため、
```PHP
if($sql_query)
```
は常にtrueになります。
これを回避するには、$sql_queryをfetchした結果がfalseになるか、
``` select count(*) from ```
のようなSQLにして、結果をfetchして件数が一件であることを確認するというのがよくある方法です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る