ObBot Wgent LiveTree Архив
Архив новостей  Архив публикаций  Разное 

Защита пароля от подбора брутфорсом


Страница:  1 2 3

Сложный парсер даты и времени начала и окончания мероприятия, написанных человеком
Простое решение парадокса Ферми
Thank God For The Bomb
Неверные загадки
Распахивание больших картинок на jQuery
Защита пароля от подбора брутфорсом
Тест на вшивость по биологии
Накрутка рекомендательного сервиса
Игра в шахматы на деньги

 

Каждый раз, когда вы, регистрируясь на каком-нибудь сайте, узнаёте, что "Ваш пароль должен состоять из как минимум 8 знаков и содержать по крайней мере 1 заглавную букву, цифру и спецсимвол", на самом деле вы узнаёте, что вебмастер этого сайта - криворукий неумеха, а владелец тяжело наслаждается синдромом вахтёра.


Это ваше и только ваше дело решать, какой длины и надёжности будет ваш пароль. А максимально защитить эккаунты от подбора пароля - это их,  владельца и вебмастера, задача. И защищать их следует уж точно не хитромудрыми угадай-цифирями (aka Captcha), которые, вдобавок, легко обходятся современными системами распознавания текстов, начиная от ста китайцев и фальшивого порносайта и заканчивая нейросетями.


Привожу ниже сначала сам пример, в котором Вам предлагается любым брутфорсом с любой мощности ботнета попытаться подобрать пароль к любому логину. А затем - самопечатающийся код скрипта, который, собственно, и выводит нижеприведённое демо. 


Пароль к любому логину - простенький, всего-то из 6 шестнадцатеричных цифр, полученных обрезкой солёного хэша логина. Например, для логина "login" пароль будет "37ce32". Чтобы угадать его, Вам нужно перебрать всего-то навсего 16^6=16777216 комбинаций, что кажется детской задачей даже для одного современного компьютера. Но при любом быстродействии вашего компьютера, этого сервера, канала связи и т.д. процесс перебора займёт у вас примерно сто дней и его никак не ускорить.


Демо защиты от подбора пароля


PHP-код данного скрипта:

<? if(false){ ?><META http-equiv=Content-Type content="text/html; charset=windows-1251"><? } //Это чтобы Dreamweaver не перепутал, в какой кодировке этот файл

define("SALT", __FILE__); // Вы же не знаете, в какой под-директории лежит у меня этот скрипт. Поэтому и соль не угадаете.

function antibrut() {
 $r=""; //Чтобы не заморачиваться потом, инициализировали мы возвращаемый результат или нет
 $login=trim( stripslashes(@$_POST["login"]) ); //Получаем введённый подборщиком логин
 $pass=trim( stripslashes(@$_POST["pass"]) ); //Получаем введённый подборщиком пароль
 $truepass=substr( md5(SALT.$login), 0, 6 ); //А правильный пароль - это всего лишь первые 6 шестнадцатиричных цифр посоленного хэша от логина. 
 mysql_query("CREATE TABLE IF NOT EXISTS flags (name VARCHAR(250) NOT NULL, value VARCHAR(250), PRIMARY KEY (name) )"); // Таблица флагов проста как веник, всего 2 поля
 mysql_query("DELETE FROM flags WHERE `name` LIKE 'Login %' AND `value`<'".(time()-60)."'"); // Удаляем из этой таблицы флаги логинов, устаревшие более чем на 1 минуту
 if( $LastLoginTry=db("value", "flags", "`name`='Login ".mq($login)."'") ) {//Вот это и есть защита от брутфорса. Обратите внимание:
// Защита не подвешивает скрипт ждать N секунд (это мало поможет против нескольких одновременных запросов, ведь для каждого из них запускается отдельный процесс),
// она не пытается блокировать вход с заданного IP и уж тем более не считает, сколько раз вы ввели неверный пароль.
// Защита просто блокирует на 1 минуту проверку пароля к заданному логину и только к нему.
  $r.='<h1 style="color:orange">Повторите попытку через '.(60-time()+$LastLoginTry).' сек.</h1>'; 
 }
 else{
  if($pass==$truepass) $r.='<h1 style="color:green">Поздравляю! Вы угадали пароль '.$pass.'</h1>';
  else{
   if($pass) {
    $r.='<h1 style="color:red">Пароль неверен</h1>';
    mysql_query("INSERT INTO `flags` SET `name`='Login ".mq($login)."', `value`='".time()."'"); // Вот тут мы устанавливаем флаг одноминутной защиты от входа на заданный логин
   }
   else $r.='<h1>Демо защиты от подбора пароля</h1>';
  }
 }
 $r.='
<form method="post">
<input type="text" style="width:40%;" placeholder="Введите любой логин" name="login" value="'.htmlspecialchars($login, ENT_QUOTES, "windows-1251").'" />
<input type="text" style="width:40%;" placeholder="Угадайте пароль из 6 знаков" name="pass" value="'.htmlspecialchars($pass, ENT_QUOTES, "windows-1251").'" />
<input type="submit" style="width:10%;" value="Ok" />
</form>
';	
 $r.="<br /><h3>PHP-код данного скрипта:</h3>	<pre>".htmlspecialchars( file_get_contents(__FILE__), ENT_QUOTES, "windows-1251" )."</pre>";
 return $r;
} // function antibrut()
$antibrut=antibrut();

//Пара функций, упрощающих мне работу с MySQL. Обратите внимание: процесс соединения с базой не показан потому, что содержит мой пароль от базы.
function db($field, $table, $where){
 $q="SELECT `".$field."` FROM `".$table."` WHERE ".$where;
 $res=mysql_query($q); 
 if(!$res || mysql_num_rows($res)==0) return false; 
 return mysql_result( $res, 0, str_replace("`","", $field) );
} //function db($field, $table, $where)

function mq($s){return mysql_real_escape_string($s);}
?>


 
 
  W-gent and ObBot / Архив / Архив публикаций / Создание сайта©www.ObBot.com

Наш хостинг-провайдер