Автор: scorpion-ds 13.11.2006 - 15:54
Необходимо как-то обезопасить сайт от подбора паролей, уже рассматривались такие варианты:
- После 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;
}
}
}