[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Просьба указать на дыры
Гость_Дмитрий
Здравствуйте. Буду очень признателен человеку, который укажет на дыру в безопасности скрипта, если она есть.

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

$receivedLogin = trim($_POST['login']);
$receivedPassword = trim($_POST['password']);

if (!empty($receivedLogin) && !empty($receivedPassword)) {
$sthBannedSelect = $db -> prepare('SELECT UNIX_TIMESTAMP(date + INTERVAL 3 MINUTE) AS block_date, try_count FROM banned_ip WHERE ip=INET_ATON(?)');
$sthBannedSelect -> execute(array($_SERVER['REMOTE_ADDR']));
$sthBannedSelect -> bindColumn('block_date', $blockDate);
$sthBannedSelect -> bindColumn('try_count', $tryCount);
$sthBannedSelect -> fetch();

if (time() - intval($blockDate) <= 0 && $tryCount >= 3)
$needBan = TRUE;

if ($needBan) {
$message = 'Вы заблокированы до ' . date('H:i:s \G\M\T P', $blockDate);
} else {
$sthClientsSelect = $db -> prepare('SELECT password, type FROM users WHERE login=?');
$sthClientsSelect -> execute(array($receivedLogin));
$sthClientsSelect -> bindColumn('password', $realPassword);
$sthClientsSelect -> bindColumn('type', $userType);
$sthClientsSelect -> fetch();

if ($realPassword == md5($receivedPassword)) {
$db -> exec('DELETE FROM banned_ip WHERE (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date + INTERVAL 3 MINUTE)) > 0');

$_SESSION['login'] = $receivedLogin;
$_SESSION['user_type'] = $userType;
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];

header("Location: index.php");
die ;

} else {
$message = 'Количество неверных попыток ограничено!';

$sthBannedCount = $db -> prepare('SELECT COUNT(*) FROM banned_ip WHERE ip=INET_ATON(?)');
$sthBannedCount -> execute(array($_SERVER['REMOTE_ADDR']));
if ($sthBannedCount -> fetchColumn()) {

$db -> prepare('UPDATE banned_ip SET try_count=try_count + 1, date=NOW() WHERE ip=INET_ATON(?)') -> execute(array($_SERVER['REMOTE_ADDR']));
} else {
$sthBannedInsert = $db -> prepare('INSERT INTO banned_ip(ip, date, try_count) VALUES(INET_ATON(?), NOW(), 1)');
$sthBannedInsert -> execute(array($_SERVER['REMOTE_ADDR']));
}

}
}
}
}




Спустя 1 час, 19 минут, 39 секунд (29.10.2011 - 03:14) johniek_comp написал(а):
закоментируй код что бы понятно было

Спустя 11 минут, 15 секунд (29.10.2011 - 03:25) Игорь_Vasinsky написал(а):
Цитата
$receivedLogin = trim($_POST['login']);
$receivedPassword = trim($_POST['password']);


но этого не достаточно, mysql_real_escape_string()

это кто вообще отправляет?

а больше то пользовательских данных то и нету....


а класс то где?


Спустя 10 часов, 26 минут, 8 секунд (29.10.2011 - 13:52) Guest написал(а):
Цитата
это кто вообще отправляет?

Это отправляет пользователь при авторизации. У него два поля: логин и пароль.

Цитата
а класс то где?

Используется расширение для работы с БД под названием PDO.
Документация PDO

Цитата
но этого не достаточно, mysql_real_escape_string()

При конструкции prepare() -> execute() PDO автоматически заботится о кавычках.

Цитата
закоментируй код что бы понятно было

Я добавил его как гость, соответственно редактировать вроде бы не могу.

Спустя 1 час, 52 минуты, 33 секунды (29.10.2011 - 15:44) Игорь_Vasinsky написал(а):
ну тогда вроде бы - чисто.

Спустя 2 часа, 24 минуты (29.10.2011 - 18:08) Гость_Дмитрий написал(а):
Цитата
ну тогда вроде бы - чисто.


Спасибо!

Спустя 11 минут, 37 секунд (29.10.2011 - 18:20) Winston написал(а):
Цитата (Гость_Дмитрий @ 29.10.2011 - 01:55)
if (!empty($receivedLogin) && !empty($receivedPassword)) {

Вы введите в поле логина и пароля по одному нулю ( 0 )
И проверка
if (!empty($receivedLogin) && !empty($receivedPassword)) 

Пойдет прахом.
Лучше так
if ((isset($receivedLogin) && $receivedLogin != '') && (isset($receivedPassword) && $receivedPassword != ''))

Ну последнюю проверку лучше использовать когда у вас допускается использования логина и пароля которые могут состоять из одного символа.

Спустя 1 час, 9 минут, 52 секунды (29.10.2011 - 19:30) imbalance_hero написал(а):
Чисто? Тут тоже? $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT']; smile.gif

Спустя 2 минуты, 9 секунд (29.10.2011 - 19:32) Guest написал(а):
Цитата
if ((isset($receivedLogin) && $receivedLogin != '') && (isset($receivedPassword) && $receivedPassword != ''))

Ваша проверка при вводе нулей пойдет прахом точно так же как и моя. Если уж разрешать нули, то вписать
 !== '' 

А в целом спасибо за замечание!

Спустя 2 минуты, 2 секунды (29.10.2011 - 19:34) Гость_Дмитрий написал(а):
Цитата
Чисто? Тут тоже? $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];

Не понял, в чем подвох? smile.gif

Спустя 4 минуты, 14 секунд (29.10.2011 - 19:38) imbalance_hero написал(а):
Внедрение XSS, HTTP - пренадлежит клиенту, и может быть легко подделана. Как в дальнейшем ты распорядишься в своих скриптах этой сессионной переменной - я не знаю, но если не так, то ошибка будет тут.

Спустя 4 минуты (29.10.2011 - 19:42) Гость Дмитрий написал(а):
Цитата
Внедрение XSS, HTTP - пренадлежит клиенту, и может быть легко подделана. Как в дальнейшем ты распорядишься в своих скриптах этой сессионной переменной - я не знаю, но если не так, то ошибка будет тут.


Я используя user_agent вот для этого:
 
if (empty($_SESSION['login']) || $_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT'])
{
header("Location: auth.php");
die ;
}


Риск есть?

Спустя 3 часа, 47 минут (29.10.2011 - 23:29) imbalance_hero написал(а):
Гость Дмитрий
В данном случае нет.

Спустя 1 час, 13 минут, 22 секунды (30.10.2011 - 00:42) Гость_Дмитрий написал(а):
Цитата
В данном случае нет.

Спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.