2016-05-09 45 views
0

スクリプトにクッキーコードを実装する方法がわかりません。相続人は以下の私のページのための私のコード:ログインスクリプトのログイン試行回数を制限するにはどうすればよいですか?

ログインページ: -

<form name="loginform" class="form-horizontal" action="includes/login.php" method="post" onsubmit="return validateloginForm()"> 

    <div class="form-group"> 
    <label for="username" class="col-sm-2 control-label">Username</label> 
    <div class="col-sm-10"> 
     <input type="text" class="form-control" name="username" placeholder="Enter the username" id="username"> 
    </div> 
    </div> 

    <div class="form-group"> 
    <label for="password" class="col-sm-2 control-label">Password</label> 
    <div class="col-sm-10"> 
     <input type="password" class="form-control" name="password" placeholder="Password" id="password"> 
    </div> 
    </div> 

    <div class="form-group"> 
    <div class="col-sm-offset-2 col-sm-10"> 
     <button type="submit" name="signin" class="btn btn-primary">Sign in</button> 
    </div> 
    </div> 
</form> 

ログインチェック私は上記のスクリプトにこのコードを実装する必要が

if(isset($_POST['signin'])) { 

    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $username = mysqli_real_escape_string($connection, $username); 
    $password = mysqli_real_escape_string($connection, $password); 

    $query = "SELECT *FROM users WHERE username = '{$username}'"; 
    $select_user_query = mysqli_query($connection, $query); 

    if(!$select_user_query) { 
     die("QUERY FAILED". mysqli_error($connection)); 
    } 
    while ($row = mysqli_fetch_array($select_user_query)) { 
     $db_user_id = $row['user_id']; 
     $db_username = $row['username']; 
     $db_user_password = $row['user_password']; 
     $db_user_firstname = $row['user_firstname']; 
     $db_user_lastname = $row['user_lastname']; 
     $db_user_role = $row['user_role']; 
    } 
    $password = crypt($password, $db_user_password); 

    if ($username !== $db_username && $password !== $db_user_password){ 
     header("Location: ../index.php"); 
    } else if ($username == $db_username && $password == $db_user_password) { 
     $_SESSION['username'] = $db_username; 
     $_SESSION['firstname'] = $db_user_firstname; 
     $_SESSION['lastname'] = $db_user_lastname; 
     $_SESSION['user_role'] = $db_user_role; 

     header("Location: ../admin"); 
    } else { 
     header("Location: ../login.php"); 
    } 
} 

if($login_incorrect){ 
    if(isset($_COOKIE['login'])){ 
      if($_COOKIE['login'] < 3){ 
       $attempts = $_COOKIE['login'] + 1; 
       setcookie('login', $attempts, time()+60*10); //set the cookie for 10 minutes with the number of attempts stored 
      } else{ 
       echo 'You are banned for 10 minutes. Try again later'; 
      } 
    } else{ 
      setcookie('login', 1, time()+60*10); //set the cookie for 10 minutes with the initial value of 1 
    } 
} 

前もって感謝します。ログインを3回に制限し、10分間禁止する必要があります。

+1

あなたown__パスワードハッシュを__rollいけないしてください。 PHPは 'password_hash()'と 'password_verify()'を提供します – RiggsFolly

+0

このコードを上記のスクリプトに実装する必要はありません。ログインカウンタを保存するために既に使用しているセッションを使用しないでください – RiggsFolly

+0

? – Morph9090

答えて

6

クッキーは信頼できる方法ではありません。
リクエストに必要なCookieを送信するスクリプトを作成できます。
ページは10分よりも古いレコードを削除するクエリを追加するロードされた後、私は、MySQL

$ip = $_SERVER["REMOTE_ADDR"]; 
mysqli_query($connection, "INSERT INTO `ip` (`address` ,`timestamp`)VALUES ('$ip',CURRENT_TIMESTAMP)"); 
$result = mysqli_query($connection, "SELECT COUNT(*) FROM `ip` WHERE `address` LIKE '$ip' AND `timestamp` > (now() - interval 10 minute)"); 
$count = mysqli_fetch_array($result, MYSQLI_NUM); 

if($count[0] > 3){ 
    echo "Your are allowed 3 attempts in 10 minutes"; 
} 

を使用します。

IPテーブル:

CREATE TABLE IF NOT EXISTS `ip` (
    `address` char(16) COLLATE utf8_bin NOT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

あなたは、

header("Location: ../login.php"); 
mysqli_real_escape_string()

mysqli_set_charset($connection, "utf8") 

代わりの追加routndトリップhttpリクエストが発生し、リダイレクトを使用するための文字セットを設定する必要があります

はるかに高速に使用します。

あなたが完全なパスを使用する必要がありますリダイレクトを行う場合
include("../login.php"); 

header("Location: http://example.com/login.php"); 

私は不要なデータをクエリで返されたとき、それは資源の無駄である、「SELECT *」を使用して好きではありません。ほとんどのクエリでは、データを返す時間がほとんどのクエリ時間を要します。フィールドの値を取得するための

私の個人的な好み:

SELECT `user_id`,`username`,`user_password`,`user_firstname`,`user_lastname`,`user_role` FROM users WHERE ... 


while (list($db_user_id,$db_username,$db_user_password,$db_user_firstname,$db_user_lastname,$db_user_role) = mysqli_fetch_array($select_user_query, MYSQLI_NUM)) { 
関連する問題