

PHPでECサイトのログイン機能を作成しております。  
データベース通りにデータを打ち込んでログインボタンを押すと、  
[![画像の説明をここに入力](https://i.stack.imgur.com/tdbWq.png)](https://i.stack.imgur.com/tdbWq.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/743bK.png)](https://i.stack.imgur.com/743bK.png)

if文の結果通りに処理が進みます。  
しかし、それ以外のパターン(ユーザ名一致、パスワード不一致)で  
データを打ち込んでログインボタンを押すと、  
[![画像の説明をここに入力](https://i.stack.imgur.com/D8ESI.png)](https://i.stack.imgur.com/D8ESI.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/h9zFZ.png)](https://i.stack.imgur.com/h9zFZ.png)  
なんと最初のif文までしか処理が進みません。

他のパターンでログインボタンを押しても同様な結果です。  
(ユーザ名不一致、パスワード一致)  
[![画像の説明をここに入力](https://i.stack.imgur.com/zYk4V.png)](https://i.stack.imgur.com/zYk4V.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/Fe1pa.png)](https://i.stack.imgur.com/Fe1pa.png)

(ユーザ名、パスワード共に不一致)  
[![画像の説明をここに入力](https://i.stack.imgur.com/q8zAf.png)](https://i.stack.imgur.com/q8zAf.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/Sy13V.png)](https://i.stack.imgur.com/Sy13V.png)

if文の書き方がおかしいと考えております。  
お手数をおかけしますがご教授お願い致します。

ソースコード  
login.php

[code]

    <?php
    require_once('../../include/conf/const.php');
    require_once('../../include/model/functions.php');
    
    session_start();
    $link = get_db_connect();
    
    if (isset($_POST['login'])) {
        $user  = $_POST['user'];
        $password = $_POST['password'];
        $user_check[] = $user;
        $user_check2[] = $password;
        var_dump($user_check);
        var_dump($user_check2);
        $err_msg = [];
        $user_login = login_logic($link, $user, $password);
        $user_name = $user_login[0];
        $user_password = $user_login[1];
        var_dump($user_name);
        var_dump($user_password);
    if ($user_check[0] == $user_name && $user_check2[0] == $user_password) {
        print "a";
    } else if ($user_check[0] !=  $user_name) {
        $err_msg['user'] = 'ユーザ名が一致しません。'; 
    } else if ($user_check2[0] != $user_password) {
        $err_msg['password'] = 'パスワードが一致しません。';
    } else if ($user_check[0] != $user_name && $user_check2[0] != $user_password) {
        $err_msg['user'] = 'ユーザ名が一致しません。'; 
        $err_msg['password'] = 'パスワードが一致しません。';
    
    }
    
    if ($user === '') {
        $err_msg['user'] = 'ユーザ名を入力してください。';
    }
    
    if ($password === '') {
        $err_msg['password'] = 'パスワードを入力してください。';
    }
        
    if (count($err_msg) !== 0)  {
         $_SESSION = $err_msg;
        header('Location: login.php');
        return;
        }
    
    }
    
    require_once('../../include/view/login2.php');
    
    close_db_connect($link);
    
[/code]

login2.php

[code]

    <?php
    
    $err_msg = $_SESSION;
    
     $_SESSION = array();
     
     session_destroy();
    ?>
    
    
    <!DOCTYPE html>
    <html lang="ja">
    <head>
       <meta charset="UTF-8">
       <title>ログイン</title>
       <style>
           input {
               display: block;
               margin-bottom: 10px;
           }
       </style>
    </head>
    <body>
       <form action="login.php" method="post">
           <label for="user">ユーザ名</label>
           <input type="text" id="user" name="user" value="">
           <?php if (isset($err_msg['user'])) : ?>
           <p><?php echo $err_msg['user']; ?></p>
           <?php endif;?>
           <label for="passwd">パスワード</label>
           <input type="password" id="password" name="password" value="">
           <?php if (isset($err_msg['password'])) : ?>
           <p><?php echo $err_msg['password']; ?></p>
           <?php endif;?>
           <input type="submit"  name="login" value="ログイン">
       </form>
    
     <a href='../../mvc/userinsert.php'>ユーザ登録ページ</a>
    </body>
    </html>
    
[/code]

functions.php

[code]

    function login_logic($link, $user, $password) {
        $sql = 'SELECT user, password FROM user_tb where user = \''.$user.'\' AND password = \''.$password.'\'';
        $data = [];
        if ($result = mysqli_query($link, $sql)) {
            while ($row = mysqli_fetch_array($result)) {
                $data = $row;
               var_dump($data);
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
            return $err_msg;
        }
        return $data;
        
    }
    
[/code]


CC BY-SA 4.0
2021-12-23T05:13:11.703
85291
2021-12-23T06:06:06.903
2021-12-23T06:06:06.903
3060
48303
question
php
if文が上手く作用しない


if文の書き方がおかしいのではなくlogin_logicの関数の仕様を理解しきれていないのでしょう。

login_logic関数はユーザ名とパスワードの両方一致すれば配列でデータを返します。  
一致しなければ何も返しません。

以下のSQLの意味はユーザ名とパスワードの両方が一致するデータを返します。  
どちらか片方だけ一致していてもだめです。

[code]

    $sql = 'SELECT user, password FROM user_tb where user = \''.$user.'\' AND password = \''.$password.'\'';
    
[/code]

じゃあどうやったら片方だけ一致した場合を返してくるようにするかと思いますが、実はそれは必要ないです。

ほかのサイトのログインを見てみましょう。パスワードだけあっている場合に一致しているかどうかの判定をしていますか？？参考にしてみてください。

ログイン判定時に大事なことは「ユーザ名とパスワードが両方一致する」かどうかでそれ以外の一致の情報は基本的には必要ないです。  
むしろセキュリティ的にNGになる可能性があります。

なのでエラーの時には基本的に「ログイン情報が違います」や「ログインできませんでした」だけのメッセージでOKです。

セキュリティ的にNGな理由としては  
もし仮にパスワードだけ一致するかどうか判定できてしまうと、ほかの人のパスワードだけを総当たりでリスト攻撃で当てることできてしまいます。ユーザ名も同様です。  
両方一致だけ判定にしておけば、総当たりに当たられたとしても、一致されるリスクは格段に下がります。


CC BY-SA 4.0
2021-12-23T05:53:28.090
85293
2021-12-23T05:53:28.090
22665
85291
answer