2017-03-14 2 views
1

だから、イムadminにメールを送信..ログインログ - ピクルスで一度

私は、正常に動作します私のクラスを作成したユーザーが、それはよのログインを押し続けている場合は、しかし、電子メールの送信を行うようにメールを1回だけ送信する必要があります。私はそれを間違った場所に置いたか、それとも私が少し失っているものをそれに追加する必要があります。

public function login($username, $password) 
    { 
     if (!empty($username) || !empty($password)) 
     { 
      $ip = $_SERVER['REMOTE_ADDR']; 
      $stmt = $this->run("SELECT * FROM `users` WHERE `username` = ?"); 
      $stmt->execute([$username]); 

      $row = $stmt->fetch(PDO::FETCH_ASSOC); 

      $blocked = $this->run("SELECT count(*) FROM `failedLogins` WHERE `ipAddress` = ?"); 
      $blocked->execute([$ip]); 
      $re = $blocked->fetchColumn(); 


      $ipBlock = $this->run("SELECT * FROM `blockedIPS` WHERE `ip` = ?"); 
      $ipBlock->execute([$ip]); 

      if ($re <= 6) { 
       if ($ipBlock->rowCount() == 0) 
       { 
        if ($stmt->rowCount() > 0) { 
         if (password_verify($password, $row['password'])) { 
          $_SESSION['user_session'] = $row['userid']; 

          $stmt = $this->run("UPDATE `users` SET `loginCount` = `loginCount` + 1, `loginIP` = ? WHERE `username` = ?"); 
          $stmt->execute([$ip, $username]); 

          $add = $this->run("INSERT INTO `loginLog` (`username`,`ipAddress`, `date`) VALUES (?,?, NOW())"); 
          $add->execute([$username, $ip]); 
          $this->redirect('home'); 

         } else { 
          $stmt = $this->run("INSERT INTO `failedLogins`(`username`,`password`,`ipAddress`,`when`,`reason`) VALUES (?,?,?,NOW(),'Incorrect Password')"); 
          $stmt->execute([$username, $password, $ip]); 

          echo Common::warning('The password you have entered is incorrect'); 
         } 
        } else { 
         $stmt = $this->run("INSERT INTO `failedLogins`(`username`,`password`,`ipAddress`,`when`, `reason`) VALUES (?,?,?,NOW(), 'Username guess, possible brute force')"); 
         $stmt->execute([$username, $password, $ip]); 
         echo Common::error('This username doesn\'t exist.'); 
        } 
       } else { 
        Common::emailAdmin("The following IP address has now been blocked from logging in: $ip"); 
        echo Common::error('Your IP address has been blocked from accessing our website.'); 
       } 
      } else { 
       $stmt = $this->run("INSERT INTO `blockedIPS`(`ip`,`date`) VALUES (?,NOW())"); 
       $stmt->execute([$ip]); 

       echo Common::error('You have tried to log in too many times incorrectly. Your account has now been frozen.'); 
      } 
     } else { 
      echo Common::warning('Please fill in both fields.'); 
     } 
    } 

チャンスは私が置き忘れてきていることが、オーバー一見に目の第二の対と私は素晴らしいことだめちゃめちゃてきたところを教えてください:

は、ここに私のコードです!

答えて

1

私は、コードのelse一部削除します:

else { 
    Common::emailAdmin("The following IP address has now been blocked from logging in: $ip"); 
    echo Common::error('Your IP address has been blocked from accessing our website.'); 
} 

をそして、あなたはblockedIPSを更新elseに電子メール線を移動、例えば:

$stmt = $this->run("INSERT INTO `blockedIPS`(`ip`,`date`) VALUES (?,NOW())"); 
$stmt->execute([$ip]); 

echo Common::error('You have tried to log in too many times incorrectly. Your account has now been frozen.'); 

Common::emailAdmin("The following IP address has now been blocked from logging in: $ip"); 

あなたが実際にある場所ですので、 IPをブロックすると、この段階で電子メールを送信します。

また、blockedIPSが実際にログインを再試行するのをブロックしているわけではありません。失敗した試行に関係なく、これらのIPがログインできないようにする必要があります。

など。

if ($ipBlock->rowCount() >= 1) { 
    // IP has been blocked already 
    echo Common::error('You have tried to log in too many times incorrectly. Your account has now been frozen.'); 
    // prevent further access 
} else { 
// do the rest, including blocking IP here 
} 
+0

トリックが完了したように見えます。if文のブロック側で処理した可能性があります。これを最初のものと混ぜると、失敗したパスワードを暗号化されていない状態にすることができます。通常、私はそれに反対するでしょうか? – Option

+0

あなたは基本的にうまくいかなかったパスワードのデータベースを作成しているので、お勧めしません。情報が流出した場合は、試行する必要のないパスワードのリストを提供しただけで、誰かがブルートフォースで正しいパスワードを強制する時間が短縮されます。 –

+0

非常に真実!私はその事例でそれをハッシュするか、必然的に必要ではないので、私が推測したように削除するでしょう。再度、感謝します! – Option