2015-11-04 3 views
1

Я просто хочу, чтобы ограничить число попыток входа в систему (после трех попыток пользователь будет заблокирован)PHP Блокирование доступа к странице входа

Я имею пользователей и пароли в базе данных уже

<?php 
// *** Validate request to login to this site. 
if (!isset($_SESSION)) { 
    session_start(); 
} 

$loginFormAction = $_SERVER['PHP_SELF']; 
if (isset($_GET['accesscheck'])) { 
    $_SESSION['PrevUrl'] = $_GET['accesscheck']; 
} 

if (isset($_POST['userName'])) { 
    $loginUsername=$_POST['userName']; 
    $password=$_POST['password']; 
    $MM_fldUserAuthorization = ""; 
    $MM_redirectLoginSuccess = "index.php"; 
    $MM_redirectLoginFailed = "login.php"; 
    $MM_redirecttoReferrer = false; 
    mysql_select_db($database_conn_helpdesk, $conn_helpdesk); 

    $LoginRS__query=sprintf("SELECT userName, password FROM technician WHERE userName=%s AND password=%s", 
    GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text")); 
    $LoginRS = mysql_query($LoginRS__query, $conn_helpdesk) or die(mysql_error()); 

    $loginFoundUser = mysql_num_rows($LoginRS); 
    if ($loginFoundUser) { 
    $loginStrGroup = ""; 

    if (PHP_VERSION >= 5.1) {session_regenerate_id(true);} else {session_regenerate_id();} 
    //declare two session variables and assign them 
    $_SESSION['MM_Username'] = $loginUsername; 
    $_SESSION['MM_UserGroup'] = $loginStrGroup;  

    if (isset($_SESSION['PrevUrl']) && false) { 

     $MM_redirectLoginSuccess = $_SESSION['PrevUrl']; 
     echo "erorr"; 
    } 
    header("Location: " . $MM_redirectLoginSuccess); 
    } 
} 
?> 

Как реализовать это в моем коде? PS: Этот код был создан Dreamweaver.

ответ

1

Сначала вам необходимо создать новую таблицу в своей базе данных для хранения информации о попытках входа с определенного компьютера. SQL-скрипт, создающий такую ​​таблицу в MySQL Server, будет следующим. Для других баз данных он будет немного отличаться.

CREATE TABLE `LoginAttempts` 
(
`IP` VARCHAR(20) NOT NULL , 
`Attempts` INT NOT NULL , 
`LastLogin` DATETIME NOT NULL 
) 

Предполагается, что у вас уже есть страница авторизации. В противном случае вы можете создать его с помощью PHP, SSI и подобных языков. В написании этой программы (сценария) нет серьезных трудностей.

Страница авторизации должна работать с двумя таблицами: одна таблица, в которой хранится информация о зарегистрированных пользователях, а другая, где указаны неудачные попытки входа в систему. Перед проверкой введенных данных система должна проверить, превысил ли пользователь предел попыток или нет. Если в таблице LoginAttempts имеется более двух записей, соответствующих одному IP-адресу, появится сообщение об ошибке, указывающее, что доступ блокируется в течение определенного периода времени. Вы можете установить период времени по своему усмотрению. В зависимости от вашей политики безопасности она может варьироваться от 1 минуты до 24 часов и более. В следующем примере доступ будет заблокирован на 30 минут.

<?php 
function confirmIPAddress($value) { 

    $q = "SELECT attempts, (CASE when lastlogin is not NULL and DATE_ADD(LastLogin, INTERVAL ".TIME_PERIOD. 
    " MINUTE)>NOW() then 1 else 0 end) as Denied FROM ".TBL_ATTEMPTS." WHERE ip = '$value'"; 

    $result = mysql_query($q, $this->connection); 
    $data = mysql_fetch_array($result); 

    //Verify that at least one login attempt is in database 

    if (!$data) { 
    return 0; 
    } 
    if ($data["attempts"] >= ATTEMPTS_NUMBER) 
    { 
    if($data["Denied"] == 1) 
    { 
     return 1; 
    } 
    else 
    { 
     $this->clearLoginAttempts($value); 
     return 0; 
    } 
    } 
    return 0; 
} 

function addLoginAttempt($value) { 

    //Increase number of attempts. Set last login attempt if required. 

    $q = "SELECT * FROM ".TBL_ATTEMPTS." WHERE ip = '$value'"; 
    $result = mysql_query($q, $this->connection); 
    $data = mysql_fetch_array($result); 

    if($data) 
    { 
    $attempts = $data["attempts"]+1;   

    if($attempts==3) { 
     $q = "UPDATE ".TBL_ATTEMPTS." SET attempts=".$attempts.", lastlogin=NOW() WHERE ip = '$value'"; 
     $result = mysql_query($q, $this->connection); 
    } 
    else { 
     $q = "UPDATE ".TBL_ATTEMPTS." SET attempts=".$attempts." WHERE ip = '$value'"; 
     $result = mysql_query($q, $this->connection); 
    } 
    } 
    else { 
    $q = "INSERT INTO ".TBL_ATTEMPTS." (attempts,IP,lastlogin) values (1, '$value', NOW())"; 
    $result = mysql_query($q, $this->connection); 
    } 
} 

function clearLoginAttempts($value) { 
    $q = "UPDATE ".TBL_ATTEMPTS." SET attempts = 0 WHERE ip = '$value'"; 
    return mysql_query($q, $this->connection); 
} 
?> 
Смежные вопросы