day & night

Безопасность при авторизации, Разработка CMS
Дата обновления: , перейти к новому сообщению
#1
scorpion-ds



Специалист
Group Icon

Группа: Наши Люди
Сообщений: 354
Регистрация: 27.03.2006
Пользователь №: 134.016


Респектов: 20
-----X----




Необходимо как-то обезопасить сайт от подбора паролей, уже рассматривались такие варианты:

- После n-ого количества попыток ввода неправильных логин/пароль, устанавливать COOKIE блокирующий дальнейшие попытки, но такой вариант ни как не запретит просто удалить этот самый COOKIE, и пробовать снова.

- После n-ого количества попыток ввода неправильных логин/пароль, блокировать атакуемую учетную запись на уровне БД сайта, но это реально, если вводится правильный логин и неправильный пароль, а если подбирается и логин тоже (как бы такой вариант не был маловероятен).

Существуют ли еще, какие ни будь алгоритмы защиты от перебора паролей?
User is offline
Go topGo end
 

Ответов(1 - 7)
14.11.2006 - 21:01
#2
дымчик



Специалист
[SoftoRooMTeaM] Group Icon

Группа: Модераторы
Сообщений: 475
Регистрация: 8.11.2005
Из: Санкт-Петербург
Пользователь №: 64.615


Респектов: 154
-----X----




Можешь попробовать делать блокировку по IP wink.gif
User is offline
Go topGo end
15.11.2006 - 11:44
#3
scorpion-ds



Специалист
Group Icon

Группа: Наши Люди
Сообщений: 354
Регистрация: 27.03.2006
Пользователь №: 134.016


Респектов: 20
-----X----




QUOTE(дымчик @ 14.11.2006 - 20:01)
Можешь попробовать делать блокировку по IP wink.gif
*


Да такой вариант тоже рассматривался, но не очень удобен, когда с одного IP адреса (возможно шлюза или прокси) на сайт ходит не только взломщик, но и нормальные посетили сайта.
User is offline
Go topGo end
icon10 15.11.2006 - 13:55
#4
дымчик



Специалист
[SoftoRooMTeaM] Group Icon

Группа: Модераторы
Сообщений: 475
Регистрация: 8.11.2005
Из: Санкт-Петербург
Пользователь №: 64.615


Респектов: 154
-----X----




QUOTE(scorpion-ds @ 15.11.2006 - 12:44)
QUOTE(дымчик @ 14.11.2006 - 20:01)
Можешь попробовать делать блокировку по IP wink.gif
*


Да такой вариант тоже рассматривался, но не очень удобен, когда с одного IP адреса (возможно шлюза или прокси) на сайт ходит не только взломщик, но и нормальные посетили сайта.
*



Ты же можешь получить всю цепочку IP-адресов, если человек сидит через прокси. А вот если через NAT, то тогда уже сложнее wink.gif
В таком случае можно использовать такую схему:
- Вычисляешь всю цепочку IPов
- В добавок к этому получаешь значения переменных $_SERVER["HTTP_USER_AGENT"], $_SERVER["HTTP_ACCEPT"],
$_SERVER["HTTP_ACCEPT_CHARSET"], $_SERVER["HTTP_ACCEPT_LANGUAGE"] + ещё что-нибудь на свое усмотрение...
- Из всего этого делаешь один MD5-хэш и уже по этому хэшу делаешь бан в случае попытки подбора пароля
User is offline
Go topGo end
15.11.2006 - 15:46
#5
scorpion-ds



Специалист
Group Icon

Группа: Наши Люди
Сообщений: 354
Регистрация: 27.03.2006
Пользователь №: 134.016


Респектов: 20
-----X----




QUOTE(дымчик @ 15.11.2006 - 12:55)

Ты же можешь получить всю цепочку IP-адресов, если человек сидит через прокси. А вот если через NAT, то тогда уже сложнее wink.gif
*


А где можно найти информацию как определить цепочку IP-адресов, я как-то вообще не задумывался что это возможно?!
User is offline
Go topGo end
icon10 16.11.2006 - 17:14
#6
дымчик



Специалист
[SoftoRooMTeaM] Group Icon

Группа: Модераторы
Сообщений: 475
Регистрация: 8.11.2005
Из: Санкт-Петербург
Пользователь №: 64.615


Респектов: 154
-----X----




QUOTE(scorpion-ds @ 15.11.2006 - 16:46)
QUOTE(дымчик @ 15.11.2006 - 12:55)

Ты же можешь получить всю цепочку IP-адресов, если человек сидит через прокси. А вот если через NAT, то тогда уже сложнее wink.gif
*


А где можно найти информацию как определить цепочку IP-адресов, я как-то вообще не задумывался что это возможно?!
*



Если человек сидит через public-proxy, то переменная $_SERVER["REMOTE_ADDR"] будет содержать цепочку IP-адресов разделенных ; (а может и , - я точно не помню)...
В итоге будет запись вида 195.131.200.22; 82.15.22.253; 192.168.20.1
User is offline
Go topGo end
17.11.2006 - 16:15
#7
scorpion-ds



Специалист
Group Icon

Группа: Наши Люди
Сообщений: 354
Регистрация: 27.03.2006
Пользователь №: 134.016


Респектов: 20
-----X----




$_SERVER["REMOTE_ADDR"] - возвращает только IP-адрес прокси сервера, прокси у нас свой, через него даже внутри сетевой трафик идет, но думаю что идея работы других прокси приблизительно такая же.
User is offline
Go topGo end
icon3 17.11.2006 - 18:26
#8
дымчик



Специалист
[SoftoRooMTeaM] Group Icon

Группа: Модераторы
Сообщений: 475
Регистрация: 8.11.2005
Из: Санкт-Петербург
Пользователь №: 64.615


Респектов: 154
-----X----




QUOTE(scorpion-ds @ 17.11.2006 - 17:15)
$_SERVER["REMOTE_ADDR"] - возвращает только IP-адрес прокси сервера, прокси у нас свой, через него даже внутри сетевой трафик идет, но думаю что идея работы других прокси приблизительно такая же.
*


Ох... сорри unsure.gif.
Вчера уже уставший был, поэтому толком не думал что писал... если пользователь использует прокси, то надо использовать $_SERVER["HTTP_X_FORWARDED_FOR"].
Вот для примера определение IP-адреса, взятое из PHPMyAdmin:
CODE

function PMA_getIp() {

   global $REMOTE_ADDR;
   global $HTTP_X_FORWARDED_FOR, $HTTP_X_FORWARDED, $HTTP_FORWARDED_FOR, $HTTP_FORWARDED;
   global $HTTP_VIA, $HTTP_X_COMING_FROM, $HTTP_COMING_FROM;

   // Get some server/environment variables values
   if (empty($REMOTE_ADDR)) {
       if (!empty($_SERVER) && isset($_SERVER['REMOTE_ADDR'])) {
           $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
       }
       else if (!empty($_ENV) && isset($_ENV['REMOTE_ADDR'])) {
           $REMOTE_ADDR = $_ENV['REMOTE_ADDR'];
       }
       else if (@getenv('REMOTE_ADDR')) {
           $REMOTE_ADDR = getenv('REMOTE_ADDR');
       }
   }
   if (empty($HTTP_X_FORWARDED_FOR)) {
       if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
           $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];
       }
       else if (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED_FOR'])) {
           $HTTP_X_FORWARDED_FOR = $_ENV['HTTP_X_FORWARDED_FOR'];
       }
       else if (@getenv('HTTP_X_FORWARDED_FOR')) {
           $HTTP_X_FORWARDED_FOR = getenv('HTTP_X_FORWARDED_FOR');
       }
   }
   if (empty($HTTP_X_FORWARDED)) {
       if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED'])) {
           $HTTP_X_FORWARDED = $_SERVER['HTTP_X_FORWARDED'];
       }
       else if (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED'])) {
           $HTTP_X_FORWARDED = $_ENV['HTTP_X_FORWARDED'];
       }
       else if (@getenv('HTTP_X_FORWARDED')) {
           $HTTP_X_FORWARDED = getenv('HTTP_X_FORWARDED');
       }
   }
   if (empty($HTTP_FORWARDED_FOR)) {
       if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED_FOR'])) {
           $HTTP_FORWARDED_FOR = $_SERVER['HTTP_FORWARDED_FOR'];
       }
       else if (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED_FOR'])) {
           $HTTP_FORWARDED_FOR = $_ENV['HTTP_FORWARDED_FOR'];
       }
       else if (@getenv('HTTP_FORWARDED_FOR')) {
           $HTTP_FORWARDED_FOR = getenv('HTTP_FORWARDED_FOR');
       }
   }
   if (empty($HTTP_FORWARDED)) {
       if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED'])) {
           $HTTP_FORWARDED = $_SERVER['HTTP_FORWARDED'];
       }
       else if (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED'])) {
           $HTTP_FORWARDED = $_ENV['HTTP_FORWARDED'];
       }
       else if (@getenv('HTTP_FORWARDED')) {
           $HTTP_FORWARDED = getenv('HTTP_FORWARDED');
       }
   }
   if (empty($HTTP_VIA)) {
       if (!empty($_SERVER) && isset($_SERVER['HTTP_VIA'])) {
           $HTTP_VIA = $_SERVER['HTTP_VIA'];
       }
       else if (!empty($_ENV) && isset($_ENV['HTTP_VIA'])) {
           $HTTP_VIA = $_ENV['HTTP_VIA'];
       }
       else if (@getenv('HTTP_VIA')) {
           $HTTP_VIA = getenv('HTTP_VIA');
       }
   }
   if (empty($HTTP_X_COMING_FROM)) {
       if (!empty($_SERVER) && isset($_SERVER['HTTP_X_COMING_FROM'])) {
           $HTTP_X_COMING_FROM = $_SERVER['HTTP_X_COMING_FROM'];
       }
       else if (!empty($_ENV) && isset($_ENV['HTTP_X_COMING_FROM'])) {
           $HTTP_X_COMING_FROM = $_ENV['HTTP_X_COMING_FROM'];
       }
       else if (@getenv('HTTP_X_COMING_FROM')) {
           $HTTP_X_COMING_FROM = getenv('HTTP_X_COMING_FROM');
       }
   }
   if (empty($HTTP_COMING_FROM)) {
       if (!empty($_SERVER) && isset($_SERVER['HTTP_COMING_FROM'])) {
           $HTTP_COMING_FROM = $_SERVER['HTTP_COMING_FROM'];
       }
       else if (!empty($_ENV) && isset($_ENV['HTTP_COMING_FROM'])) {
           $HTTP_COMING_FROM = $_ENV['HTTP_COMING_FROM'];
       }
       else if (@getenv('HTTP_COMING_FROM')) {
           $HTTP_COMING_FROM = getenv('HTTP_COMING_FROM');
       }
   }

   // Gets the default ip sent by the user
   if (!empty($REMOTE_ADDR)) {
       $direct_ip = $REMOTE_ADDR;
   }

   // Gets the proxy ip sent by the user
   $proxy_ip     = '';
   if (!empty($HTTP_X_FORWARDED_FOR)) {
       $proxy_ip = $HTTP_X_FORWARDED_FOR;
   } else if (!empty($HTTP_X_FORWARDED)) {
       $proxy_ip = $HTTP_X_FORWARDED;
   } else if (!empty($HTTP_FORWARDED_FOR)) {
       $proxy_ip = $HTTP_FORWARDED_FOR;
   } else if (!empty($HTTP_FORWARDED)) {
       $proxy_ip = $HTTP_FORWARDED;
   } else if (!empty($HTTP_VIA)) {
       $proxy_ip = $HTTP_VIA;
   } else if (!empty($HTTP_X_COMING_FROM)) {
       $proxy_ip = $HTTP_X_COMING_FROM;
   } else if (!empty($HTTP_COMING_FROM)) {
       $proxy_ip = $HTTP_COMING_FROM;
   }

   // Returns the true IP if it has been found, else FALSE
   if (empty($proxy_ip)) {
       // True IP without proxy
       return $direct_ip;
   } else {
       $is_ip = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxy_ip, $regs);
       if ($is_ip && (count($regs) > 0)) {
           // True IP behind a proxy
           return $regs[0];
       } else {
           // Can't define IP: there is a proxy but we don't have
           // information about the true IP
           return FALSE;
       }
   }
}
User is offline
Go topGo end

Topic Options
Сейчас: 27.04.2024 - 10:21
Мобильная версия | Lite версия