PDA

Просмотр полной версии : Ускорение работы брута POST-запросами


bnromanoff
13.05.2011, 18:01
Доброго времени суток!

Есть необходимость отправить на сайт, находящийся на виртуальном хостинге masterhost, порядка 100 млн. POST-запросов и определенным образом зафиксировать результат.

Написал php-скрипт, осуществляющий перебор, однако возникла проблема со скоростью:

fsockopen() работает медленно, порядка 0.2-0.3 секунды на запрос, даже если в открытый сокет послать пачку запросов, и уже после принимать результат

При использовании curl результат более приемлемый, при работе в 2 потока на запрос уходит порядка 0.03 секунды, однако процесс периодически залипает на несколько секунд. Если использовать больше потоков - валится сайт с ошибкой 503.

Возможно есть какой-то более быстрый способ? Для фиксации результата можно использовать только заголовки, однако при использовании HEAD-запроса невозможно отправить данные через POST. Обрезать размер получаемых данных через curl также не представляется возможным - сервер не возвращает длину контента, поэтому ограничение CONTENT_LENGTH не работает.

Буду признателен за советы!

Expl0ited
13.05.2011, 18:53
Цель какая преследуется?

Если нужно слить инфу например через скул инъекцию, тогда сложно что-то придумать если сайт падает с двух потоков (если бы не падал, можно было например запустить распределенный дамп с 10-100 серверов, и слать результаты на один), если тебе важно получить ответ от сервера, тогда ускорить процесс можно только многопоточностью. Да даже если цель какая-то другая, ты можешь уронить сервак (читай как задидосить) своими запросами.

bnromanoff
13.05.2011, 19:02
Цель именно получить информацию, т.е. ответ сервера на каждый из посылаемых запросов.

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

Если есть способ получить только заголовки в ответ на POST-запрос, думаю это позволит ускорить перебор, по крайней мере будет не так забивать канал.

Expl0ited
13.05.2011, 19:18
PHP:
'value','var2'=>'value');

$host='http://php.net/';

print"";

printimplode('
',get_header($host,$post));

print"";

?>

bnromanoff
13.05.2011, 19:21
Увы, такой вариант пробовал - CURLOPT_NOBODY не работает вместе с POST, т.е. при

curl_setopt($curl, CURLOPT_NOBODY, 1);

посылается HEAD-запрос, несмотря на то, что отмечен CURLOPT_POST

Expl0ited
13.05.2011, 19:22
Собственно я так и не понял, что именно не работает?

bnromanoff
13.05.2011, 19:29
Скрипт на сайте, к которому обращается наш скрипт, принимает данные только через метод POST

Если использовать Вашу функцию:


PHP:
$curl=curl_init($host);

curl_setopt($curl,CURLOPT_POST,1);

curl_setopt($curl,CURLOPT_POSTFIELDS,$data);

curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);

curl_setopt($curl,CURLOPT_HEADER,1);

curl_setopt($curl,CURLOPT_NOBODY,1);

$content=curl_exec($curl);

curl_close($curl);

returnexplode("\r\n",$content);

то curl при отмеченном параметре CURLOPT_NOBODY, посылает HEAD-запрос на сайт, вместо нужного нам POST, независимо от того, стоит ли флаг CURLOPT_POST.

А в описании протокола http говорится, что метод HEAD во всем идентичен методу GET, за исключением одного - ответ на HEAD-запрос не содержит тела сообщения, только заголовки.

Таким образом, если отметить CURLOPT_NOBODY, то параметры запроса будут посланы методом GET, и целевой скрипт их не обработает => не возвратит нужный результат.

Доказано опытным путем )

bnromanoff
13.05.2011, 20:26
1. Уверен, при наличии любого GET параметра возвращает 404

2. Пробовал - увы, разница даже если и есть, то практически незаметна

попугай
14.05.2011, 19:59
А что fsockopen работает медленнее чем curl?

bnromanoff
14.05.2011, 20:04
Да, в моем случае один запрос через curl выполняется быстрее на порядок чем через fsockopen

Dr.Z3r0
20.05.2011, 19:05
Попробуй разбери мою утилиту, и выдерни классы для работы с сетью

https://rdot.org/forum/showthread.php?t=1160

Там же есть класс для работы с кип-аливе соединениями, пул неблокирующих сокетов и тд. Код прокоментирован, я думаю разберешься.

PS. Я как-то тестировал, fsockopen работает быстрее курла. Одна из возможных проблем - посылаемый Connection: keep-alive вместо Connection: close, тогда соединение может долго висеть.