|
Глава 2. Итак начнем разбор скрипта, приведенного в главе 1. В этом скрипте собрано большинство механизмов, составляющих суть спамминга. Начнем с азов. Чаще всего сервера конфигурируются таким образом, что фалы с расширением *.PHP рассматриваются как исполняемые скрипты на языке PHP. Заметьте - я сказал "чаще всего", а не "всегда". Дело в том,что сервер можно настроить таким образом, чтобы любо удобное вам расширение служило признаком скрипта на PHP. Причем это относится к любым видам расширений и серверных языков. Но мы будем рассматривать классический случай. Итак, просто дать файлу расширение PHP недостаточно для того, чтобы он начал выполнять какие-нибудь нужные нам действия. Внутри файла должны быть размещены блоки кодов, которые , собственно, и составляют суть программы. Таких блоков кода может быть от 1 до практически бесконечности,в разумных пределах, конечно Такие участки кода заключаются между тегами <?php ?> . Все что находится за пределами этихтегов будет просто выводиться клиенту как обычный HTML. Открыли секцию кода на языке PHP Включили вывод всех ошибок и предупреждений. Дело в том, что в целях безопасности, на многих хостах вывод этих сообщений по умолчанию отключен. И это правильно, но это очень сильно затрудняет отладку и диагностику скриптов. Соответственно я порекомендую всем на этапе разработки скрипта вставлять эту строку, а по завершении написаниязакомментировать или вообще удалить. $PostUrl="http://example.com/post.php"; $PostData="Text=text&User=user"; $OkString="";
|
Инициализация переменных. В принципе в переменные можно заносить какие угодно данные, но лучше если значения хотябы отдаленно будут схожи со значениями, которые будут в них заноситься на этапе выполнения. Во первых это повысит читабельность скрипта, во-вторых облегчит процесс отладки. $PostUrl - переменная содержит ПОЛНЫЙ URL к скрипту принимающему данные от скрипта $PostData - массив данных пересылаемых удаленному скрипту $OkString - переменная содержит строку, возвращаемую удаленным скриптом в случае удачного постинга. К примеру некоторые гуестбуки любят писать "Thank you for posting" или чтото подобное. Тода мы присваиваем этой переменной значение в виде этой строки и после постинга скрипт проверит наличие строки в полученной странице. Если строка есть - постинг успешный, если нет - проблемы. Если эту переменную оставить пустойто признаком успешности постинга служит нулевое состояние ошибки соединенияс сервером. if (!empty($HTTP_GET_VARS)) extract($HTTP_GET_VARS); if (!empty($HTTP_POST_VARS)) extract($HTTP_POST_VARS);
|
По документации PHP самдолжен создавать переменные с именем и значением взятыми из строки запроса или из массива данных POST. На практике эе я достаточно часто встречал хосты, на которых этого не происходило. Для решения этой проблемы и служат эти 2 строки. $Url=substr($PostUrl,strpos($PostUrl,"//")+2); $Url=substr($Url,0,strpos($Url,"/"));
|
А вот с этого места уже начинается плезная работа скрипта. Здесь мы выделяем из полного URL ту составляющую,которая адресует нужный нам скрипт в рамках сервера. $HostName=substr($PostUrl,strpos($PostUrl,"//")+2); $HostName=substr($HostName,strpos($HostName,"/"));
|
Выделяем из полного URL имя сервера. if(strpos($HostName,":")) { $HostPort=substr($HostName,strpos($HostName,":")+1); if(!is_numeric($HostPort)) { $HostPort=80; } } else { $HostPort=80; }
|
Большиство www-серверов работают на 80 порту. Хотя бывают и исключения - именно для нихэтот участок кода. Если в адресе сервера есть ":" то после него должна следовать цифра, указывающая порт на котором работает сервер. Если этого нет, значит сервер на стандартном порту 80. $fp=fsockopen($HostName, $HostPort, $errno, $errstr, 30);
|
Устанавливаем соединение с сервером. Адрес сервера в переменной $HostName, порт $HostPort. Переменные $errno и $errstr предназначены для хранения сообщений об ошибках в цифровом и текстовом виде соответственно. 30 - это значение таймаута, по истечении которого принимается решение что соединение установить невозможно. if (!$fp) { echo "$errstr ($errno)<br />\n"; }
|
Если соединение прошло неуспешно, выводим сообщение об ошибке ставшей причиной проблемы. else { $out = "POST $Url HTTP/1.1\r\n"; $out .= "Host: $HostName\r\n"; $out .= "Content-type: application/x-www-form-urlencoded\r\n"; $out .= "Connection: Close\r\n"; $out .= "Content-length: ".strlen($PostData)."\r\n\r\n".$PostData;
|
Если соединение прошло успешно, то формируем пакет запрса к серверу. stream_set_timeout($fp, 30);
|
Выставляем таймау на операции с сервером. Если в течение заданного отрезка времени не происходит никакого обмена данными, то считаем чо соединение подвисло и обрываем его. Передаем ранее сформированный пакт данных серверу. if(strlen($OkString)) { $Page=""; while (!feof($fp)) { $Page.=fgets($fp, 128); } if(strpos($Page,$OkString)) echo "Ok"; else echo "Error"; } else { if($errno===0) echo "Ok"; else echo "Error"; }
|
Если переменная $OkString не пустая то получаем ответ сервера в переменную $Page и проверяем на наличие в ней сигнальной строки. Если же в $OkString пусто то принаем решение об успешности или неуспешности на основе значения переменной $errno. Закрываем соединение с сервером, если оно до сих пор открыто. Окончание блока кода Вот разложенный по полочкам функционал скрипта из первой главы. Автор: BiOM Источник и обсуждение статьи
Просмотров: 1240
 Ваш комментарий будет первым | | |