2015-06-11 2 views
-1

Как заблокировать пользователя после 3 попыток входа в систему и сохранить его в базе данных? Я уже добавляю два столбца в таблицу пользователя, один для числа попыток входа и второй, для даты и времени последнего входа. Пожалуйста, помогите мне, как это сделать. Я не очень хорош в PHP.Заблокировал пользователя после 3 попыток в PHP?

Благодаря

Вот мой login.php

session_start(); 
$ipaddress = ''; 
if (getenv('HTTP_CLIENT_IP')) 
    $ipaddress = getenv('HTTP_CLIENT_IP'); 
else if(getenv('HTTP_X_FORWARDED_FOR')) 
    $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); 
else if(getenv('HTTP_X_FORWARDED')) 
    $ipaddress = getenv('HTTP_X_FORWARDED'); 
else if(getenv('HTTP_FORWARDED_FOR')) 
    $ipaddress = getenv('HTTP_FORWARDED_FOR'); 
else if(getenv('HTTP_FORWARDED')) 
    $ipaddress = getenv('HTTP_FORWARDED'); 
else if(getenv('REMOTE_ADDR')) 
    $ipaddress = getenv('REMOTE_ADDR'); 
else 
    $ipaddress = 'UNKNOWN'; 

$loginDate = date("Y-m-d H:i:s"); 
$Error =""; 
$successMessage =""; 
if (isset($_POST['submit'])){ 
if (!($_POST['cnumber'] == "" && $_POST['password'] == "")){ 
    $cnumber=$_POST['cnumber']; 
    $password= sha1($_POST['password']); 
    $cnumber = filter_var($cnumber, FILTER_SANITIZE_NUMBER_INT); 

if (filter_var($cnumber, FILTER_VALIDATE_INT)){ 
$con=mysqli_connect("localhost","root","","users"); 

$result = mysqli_query($con, "SELECT * FROM users WHERE contractNumber='$cnumber' AND password='$password'"); 
$data = mysqli_num_rows($result); 

if($data==1){ 
    $_SESSION['login_user']=$cnumber; 
    mysqli_query($con, "INSERT INTO `users`.`logs`(`contractNumber`, `lastLogin`, `ipAddress`) VALUES ('$cnumber', '$loginDate', '$ipaddress')"); 
    header('Location: profile.php'); 
} else { 
    $Error ="Invalid Contract Number or Password."; 
    mysqli_query($con, "UPDATE users SET loginAttempt = loginAttempt + 1 WHERE contractNumber = '$cnumber' "); 
    print_r(mysqli_affected_rows($con)); 
} 
    mysqli_close($con); 
} else { 
    $Error ="Invalid Contract Number."; 
} 
} else { 
    $Error ="Contract Number or Password is Empty."; 
} 
} 
+3

Сохраните количество попыток входа в сеанс. После того, как это значение передано, больше не отображается форма входа в систему ... Альтернативно/дополнительно, если один раз сеанс превысит лимит, не подтвердите свою учетную запись в БД и попросите их связаться с администратором для доступа. – chris85

+0

@ chris85 как это сделать? Я плохо разбираюсь в php. ты можешь помочь мне с этим? – User014019

+2

Не храните # попыток в сеансе. Затем бот может просто игнорировать файлы cookie сеанса и продолжать попытки без блокировки. Или сохраните неудачные попытки входа в базу данных по IP-адресу или номеру контакта (в зависимости от того, хотите ли вы заблокировать учетную запись или IP-адрес). – drew010

ответ

0

Похожая Q & А можно найти в этой теме: Increment a database field by 1

Попытки входа фактически должны храниться отдельно от пользователя Таблица. Вы можете заблокировать попытки входа, сохранив количество попыток на стороне клиента (количество попыток в cookie) или сохраните IP-адрес пользователя, пытающегося войти в систему с количеством попыток на стороне сервера (в вашей базе данных SQL); увеличивая количество попыток за каждый неудачный логин. Метод cookie имеет недостаток, заключающийся в том, что он легко обходит атакующего. Метод IP-адреса сложнее обойти, но имеет недостаток блокирования людей, использующих один и тот же IP-адрес. Я бы использовал немного обоих методов; применяя такие правила, как 3 попытки для файла cookie и 15 попыток для таблицы IP-адресов/попыток.

IP address variable: $_SERVER["REMOTE_ADDR"]; 
Getting cookies: $_COOKIE["cookie_name"]; 
Setting cookies: setcookie("cookie_name", "value", time()+$seconds); 

Базовая реализация метода печенья:

// before login attempt: 
$attempt_count = intval(@$_COOKIE["login_count"]); 
if($attempt_count > 3){ 
    die("Too many attempts"); 
} 

_

// on failed login attempt: 
setcookie("login_count", $login_count+1, time()+600); 
// cookie set to expire at (now+600 seconds); 10 minutes 

http://php.net/manual/en/function.setcookie.php

0

Во-первых, когда пользователь пытается с неправильным паролем, который вы должны увеличивать поле Логин попытка один. Затем проверьте количество попыток входа в систему равным 3 или нет. если это 3 означает то блокировать пользователя, изменив свой статус

$result = mysqli_query($con, "SELECT * FROM Users WHERE contractNumber='$cnumber' AND password='$password'"); 
    $data = mysqli_num_rows($result); 
    if($data==1) 
    { 
      $_SESSION['login_user']=$cnumber; // Initializing Session 
      header('Location: profile.php'); 
    } 
    else 
    { 
      mysqli_query($con, "UPDATE tablename login_attempts = login_attempts+1 WHERE contarct_number = ". $cnumber"); 
      /*Select query login attempts and check the count*/ 


    } 
+0

Таблица не обновляется – User014019

+0

Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/80642/обсуждение промежуточности Сивабалан-и-user014019). – Sivabalan

1

Не использовать куки, как хакер может все еще отключить куки и продолжить атаки грубой силы. Вместо этого используйте свою базу данных. Для каждой неудачной попытки запишите ее в таблицу вместе с меткой времени. Затем по каждому запросу выполните запрос с идентификатором пользователя и отметкой времени, а затем получите счетчик. Это должно дать вам количество попыток.

Смежные вопросы