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

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


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

Редирект с YouTube shorts на страницу видео
Быстро, дёшево и качественно
Правильный генератор паролей
Language hack для любой CMS
Сложный парсер даты и времени начала и окончания мероприятия, написанных человеком
Простое решение парадокса Ферми
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

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