Необходимо как-то обезопасить сайт от подбора паролей, уже рассматривались такие варианты:
- После n-ого количества попыток ввода неправильных логин/пароль, устанавливать COOKIE блокирующий дальнейшие попытки, но такой вариант ни как не запретит просто удалить этот самый COOKIE, и пробовать снова.
- После n-ого количества попыток ввода неправильных логин/пароль, блокировать атакуемую учетную запись на уровне БД сайта, но это реально, если вводится правильный логин и неправильный пароль, а если подбирается и логин тоже (как бы такой вариант не был маловероятен).
Существуют ли еще, какие ни будь алгоритмы защиты от перебора паролей?
дымчик, 14.11.2006 - 21:01
Можешь попробовать делать блокировку по IP
scorpion-ds, 15.11.2006 - 11:44
QUOTE(дымчик @ 14.11.2006 - 20:01)
Можешь попробовать делать блокировку по IP
Да такой вариант тоже рассматривался, но не очень удобен, когда с одного IP адреса (возможно шлюза или прокси) на сайт ходит не только взломщик, но и нормальные посетили сайта.
дымчик, 15.11.2006 - 13:55
QUOTE(scorpion-ds @ 15.11.2006 - 12:44)
QUOTE(дымчик @ 14.11.2006 - 20:01)
Можешь попробовать делать блокировку по IP
Да такой вариант тоже рассматривался, но не очень удобен, когда с одного IP адреса (возможно шлюза или прокси) на сайт ходит не только взломщик, но и нормальные посетили сайта.
Ты же можешь получить всю цепочку IP-адресов, если человек сидит через прокси. А вот если через NAT, то тогда уже сложнее В таком случае можно использовать такую схему: - Вычисляешь всю цепочку IPов - В добавок к этому получаешь значения переменных $_SERVER["HTTP_USER_AGENT"], $_SERVER["HTTP_ACCEPT"], $_SERVER["HTTP_ACCEPT_CHARSET"], $_SERVER["HTTP_ACCEPT_LANGUAGE"] + ещё что-нибудь на свое усмотрение... - Из всего этого делаешь один MD5-хэш и уже по этому хэшу делаешь бан в случае попытки подбора пароля
scorpion-ds, 15.11.2006 - 15:46
QUOTE(дымчик @ 15.11.2006 - 12:55)
Ты же можешь получить всю цепочку IP-адресов, если человек сидит через прокси. А вот если через NAT, то тогда уже сложнее
А где можно найти информацию как определить цепочку IP-адресов, я как-то вообще не задумывался что это возможно?!
дымчик, 16.11.2006 - 17:14
QUOTE(scorpion-ds @ 15.11.2006 - 16:46)
QUOTE(дымчик @ 15.11.2006 - 12:55)
Ты же можешь получить всю цепочку IP-адресов, если человек сидит через прокси. А вот если через NAT, то тогда уже сложнее
А где можно найти информацию как определить цепочку IP-адресов, я как-то вообще не задумывался что это возможно?!
Если человек сидит через public-proxy, то переменная $_SERVER["REMOTE_ADDR"] будет содержать цепочку IP-адресов разделенных ; (а может и , - я точно не помню)... В итоге будет запись вида 195.131.200.22; 82.15.22.253; 192.168.20.1
scorpion-ds, 17.11.2006 - 16:15
$_SERVER["REMOTE_ADDR"] - возвращает только IP-адрес прокси сервера, прокси у нас свой, через него даже внутри сетевой трафик идет, но думаю что идея работы других прокси приблизительно такая же.
дымчик, 17.11.2006 - 18:26
QUOTE(scorpion-ds @ 17.11.2006 - 17:15)
$_SERVER["REMOTE_ADDR"] - возвращает только IP-адрес прокси сервера, прокси у нас свой, через него даже внутри сетевой трафик идет, но думаю что идея работы других прокси приблизительно такая же.
Ох... сорри . Вчера уже уставший был, поэтому толком не думал что писал... если пользователь использует прокси, то надо использовать $_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; } } }