( Вход | Регистрация | Поиск )

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

·scorpion-ds
Группа: Наши Люди

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

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

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

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


Ответов(1 - 7)

·дымчик
Группа: Модераторы

Сообщений: 475
Можешь попробовать делать блокировку по IP wink.gif


·scorpion-ds
Группа: Наши Люди

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


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


·дымчик
Группа: Модераторы

Сообщений: 475
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-хэш и уже по этому хэшу делаешь бан в случае попытки подбора пароля


·scorpion-ds
Группа: Наши Люди

Сообщений: 354
QUOTE(дымчик @ 15.11.2006 - 12:55)

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


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


·дымчик
Группа: Модераторы

Сообщений: 475
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


·scorpion-ds
Группа: Наши Люди

Сообщений: 354
$_SERVER["REMOTE_ADDR"] - возвращает только IP-адрес прокси сервера, прокси у нас свой, через него даже внутри сетевой трафик идет, но думаю что идея работы других прокси приблизительно такая же.


·дымчик
Группа: Модераторы

Сообщений: 475
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;
       }
   }
}