2009-04-30 2 views
4
<form action="form.php" method="post"> 
    Username: <input type="text" name="user" maxlength="50" value="" /> 
    Password: <input type="password" name="pass" maxlength="20" value="" /> 
    <input type="submit" name="Submit" value="Submit" /> 
    </form> 
    <?php 
    $Accesstrys = 0; 
    if($_POST['Submit'] == "Submit") { 
    $Accesstrys++; 
    if($Acesstrys == 3) 
    { 
    $ip = getenv("REMOTE_ADDR"); 
    $file = fopen("Loginlimit/$ip",'w'); 
    fwrite($file,"$Accesstrys:$ip"); 
    } 
    } 
    ?> 

Im пытается скомпилировать скрипт входа PHP, дает вам 3 попытки войти в систему, если вы терпите неудачу, когда он замерзнет, ​​так как позволяет сказать 10мин.PHP Форма входа

далекий от завершения, но я протестировал это, и он не создал/не написал файл с моим ip. что им нехорошо

ответ

0

Каждый раз, когда вы отправляете попытку, он сбрасывает количество попыток доступа на 0. Вам нужно сохранить количество попыток в решении на стороне сервера, таком как база данных или сеанс.

EDIT Как уже упоминалось в моих комментариях, мой предыдущий мозг о помещении такой информации в файл cookie - это худшие практики. Спасибо звездам за редактирование сообщества.

+1

Vritual -1 предложившего хранящую информацию о сервере в печенье. Печенье не безопасно. Никогда. Когда-либо. – jmucchiello

+0

Они могут быть, если они зашифрованы перед отправкой в ​​браузер, но по существу это делает работу в 100 раз больше, чем просто использование сеанса, который держит его на стороне сервера. –

7

Поскольку PHP является серверной, ваша переменная $Accesstrys устанавливается в 0 при каждом запросе.

Ключом является использование сеансов. Попробуйте приращением $_SESSION["AccessTrys"] вместо $Accesstrys

1

На первый взгляд, кажется, что вы overwritting @ Accesstrys каждый раз с 0, что дает вам максимум на 1. То, что вы должны сделать, это установить $ Accestrys файл 0, а затем установите переменную в файл, увеличить переменную, а затем установить файл равным переменной.

3

PHP, как и большинство динамических языков, используемых специально для веб-приложений, работает в среде без гражданства. Для того, чтобы отслеживать попытки входа между HTTP-запросами вам нужно к session для пользователей:

<?php 

session_start(); 
if (!isset($_SESSION['Accesstrys'])) { 
    $_SESSION['Accesstrys'] = 0; 
} 
$_SESSION['Accesstrys']++; 
// ... your code goes here ... 
1

Есть много проблем Подхода вы имеете принять. Например

  1. REMOTE_ADDR не является уникальным для каждого пользователя
  2. Запись информации в файл не будет работать, если вы не заботиться о одновременных пользователей ударяя сервера
  3. $ Accesstry ++ исчезает каждый раз, когда он используется таким образом его значение никогда не будет сохранено.
  4. и т.д ..

Вы должны использовать функцию, которая называется сеансами и хранить информацию в сессии или базе данных. Взгляните на http://us.php.net/manual/en/features.sessions.php

2

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

База данных также позволит вам блокировать учетные записи, когда они достигнут 3 неудачных попытки.

Если вы действительно нуждаетесь в безопасности, вы можете использовать смесь сеансов и столбцов базы данных, но хранить данные сеанса в базе данных. В Google есть много примеров того, как это сделать, используя функцию set_session_save_handler.

+0

Это не помешает кому-то забивать форму с плохими именами. Могут ли они сделать разгон, где 5 плохих догадок - это тайм-аут, затем 3, затем 2, затем 1, и каждая догадка после одного приводит к увеличению времени ожидания? – MrChrister

+0

возможно. неудобно кодировать. Или вы можете просто начать запрещать ip (либо с сайта, либо с входа в систему) - Проблема: что, если у них есть динамический ip? Любые идеи вокруг этого? Файлы cookie можно удалить. Для сеансов необходимы файлы cookie. Пользовательские агенты слишком распространены, чтобы запретить пользователям. –

2

Вы хотите использовать базу данных для хранения количества попыток (по IP-адресу или лучше по имени пользователя), так как другие упомянули, что ваш $ Accesstrys будет сброшен до нуля по каждому запросу.

Я удивлен, что многие люди предложили использовать сеансы для отслеживания количества попыток. Там есть фундаментальный недостаток безопасности - если попытки входа в систему исходили от автоматизированного бота, пытающегося взломать учетную запись, не было бы файлов cookie (или идентификатора сеанса URL), и ваше отслеживание сеанса доступа было бы бесполезным.

0

Я хотел бы добавить еще одну проблему в код, вместо того чтобы проверять значение отправки равным ей, использовать ISSET.

if(isset($_POST['Submit'])) { 
// Action code 
} 

Ознакомьтесь с примерами того, как форма входа может быть разработана эффективно.
См следующие ссылки:
Login form sample code
File open and Write - PHP Function
Session to track the value until session expires/browser closed