[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Для критики: Работа с пакетами
DySprozin
просьба покидать камнями)))

Что умеет скрипт:
- отсылка пакетов с непосредственным просмотром результата в окне браузера;
- поддержка не только http протокола (GET/POST/HEAD), но и любых(?) других (pop3, https...)
- возможность работы через проксю
- возможность показывать/скрывать заголовки GET/POST запросов
- возможность автоподсчета длины POST-данных
- возможность установки <base href> для GET и POST запросов (результат - сохранение путей)
- возможность запрета автоматического перенаправления
- возможность не заполнять поле "Хост" (если он указан в пакете)
- возможность отсылать данные на любой порт
- возможность регулировки таймаута

<?
set_time_limit(0);

function unchunk($result) {
if(preg_match("#(^.*(?!\r\n\r\n|\n\n).*(?:\r\n\r\n|\n\n))[0-9A-F]+(?!\r\n\r\n|\n\n).*(?:\r\n\r\n|\n\n)(.*)$#isU",$result,$tmp)==1) $result=$tmp[1].$tmp[2];
return preg_replace_callback(
'/(?:(?:\r\n|\n)|^)([0-9A-F]+)(?:\r\n|\n){1,2}(.*?)'
.'((?:\r\n|\n)(?:[0-9A-F]+(?:\r\n|\n))|$)/si',
create_function(
'$matches',
'return hexdec($matches[1]) == strlen($matches[2]) ?
$matches[2] :
$matches[0];'

),
$result
);
}

function gethost($host){
if(preg_match("#:([0-9]+)[^0-9]+#isU",$host."/",$tmp)==1) { //порт указан явно
$port=$tmp[1]; //порт
if(strpos($host,"://")!==false) {
$tmp=explode("://","$host");
$host=$tmp[1];
}
$tmp=explode(":",$host);
$host=$tmp[0];
$tmp=explode("/",$host);
$host=$tmp[0]; //хост
}
elseif (preg_match("#^([a-z]+)://([^/]+)[/]+#isU", $host."/", $tmp)==1) { //порт указан через префикс (http(s),ftp)
$host=$tmp[2]; //хост
if($tmp[1]=="http") $port=80; //порт
elseif($tmp[1]=="https") $port=443;
elseif($tmp[1]=="ftp") $port=21;
else exit("<span class='warr'>Я знаю только ftp://, http://, https://</span>");
}
else {
$tmp=explode("/",$host);
$host=$tmp[0];
$port=80;
}
$ret[0]=$host;
$ret[1]=$port;
return $ret;
}


if(isset($_POST['packet'])){
echo <<<STYLE
<style type="text/css">
.warr {
margin:5px;
font-weight:bold;
}
.mainbody {
text-align:left;
font-size:10pt;
}
</style>

STYLE;
}

if(isset($_POST['packet']) && $_POST['packet']=="") exit("<span class='warr'>А что отправять-то будем?</span>");
elseif(isset($_POST['packet']) && $_POST['packet']!="") {
$host=$_POST['host'];
$proxy=$_POST['proxy'];
$packet=$_POST['packet'];
$packet=str_replace("\r\n","\n",$packet);
$tout=$_POST['tout'];
////
//Узнаем хост и порт
//если хост/прокси не указаны - пытаемся выцепить хост из запроса

$ch=preg_match("#Host:[\s]*([^\s]+)#is",$packet,$tmp);
if($ch==1 && $host=="" && $proxy=="") {
$host=$tmp[1];
$port=80;
}
elseif($ch==1){
$sockhost=$tmp[1];
}
elseif($ch==0) $sockhost="";
if($ch==0 && $host=="" && $proxy=="") exit("<span class='warr'>А куда отправлять-то будем?</span>");
elseif($proxy!="") { //Если есть прокси - коннектимся через него
$tmp=gethost($proxy);
$host=$tmp[0];
$port=$tmp[1];
}
else {
$tmp=gethost($host);
$host=$tmp[0];
$port=$tmp[1];
}
//
////

$f=@fsockopen($host,$port,$errno,$errstr,$tout);
if($f==false) exit("<div class='warr'>Что-то никто не отвечает... Наверное, дома никого нету =)<br>Для справки:<br>\$errno=$errno<br>\$errstr=$errstr</div>");
if(isset($_POST['postlen']) && preg_match("#(?<=^POST) ([^\s]+)[\s]#isU",$packet)==1) {
preg_match("#(?<=\n\n)(.*)$#isU",$packet,$tmp);
$conlen=strlen($tmp[1]);
}

$packet=explode("\n",$packet);

$quit="";
foreach($packet as $key => $value){
if($value=="quit") {$quit="quit"; break;}
if($value=="exit") {$quit="exit"; break;}
if($key==0 && preg_match("#(?<=^POST|^GET) ([^\s]+)[\s]#isU",$value,$tmp)==1) {
$url="http://".(isset($sockhost) && $sockhost!=""?$sockhost:$host).$tmp[1];
if(isset($conlen)) $conlen="Content-Length: $conlen\n";
else $conlen="";
}
elseif($key==0) {$url="";$conlen="";}
if(isset($conlen) && $conlen!="" && strpos($value,"Content-Length")!==false) continue; //скип дубей Content-Length
if ($key==0) fputs($f,$value."\n$conlen"); //Content-Length вставляется сразу после POST /
else fputs($f,$value."\n");
if ($url=="") sleep(1); //если не GET/POST запрос - секунда задержки между командами
}
fputs($f,$quit."\n\n");
$out="";
$ch=0;
while((!feof($f))){
$tmp=fgets($f,100);
$out.=$tmp;
//echo $tmp;
//$ch++;
//if($ch>3) {break;}

}
//exit($out);
$out=unchunk($out);
//exit($out);
if(isset($_POST['noReload'])){
$out=str_replace("refresh","rеfresh",$out); // Заменили
$out=str_replace("reload","rеload",$out); // англ. "e"
$out=str_replace("replace","rеplace",$out); // на рус.
$out=str_replace("location","lоcation",$out); // o на рус.
}


if(isset($_POST['basehref']) && $url!=""){

$out="<base href='$url'>".$out;
}

//Вкл/выкл Заголовки
if($url!="") {
preg_match("#(HTTP.*(?!\r\n\r\n).*)(?=\r\n\r\n)#sU",$out,$tmp);
$header="<html><body class='mainbody'>".str_replace("\r\n","<br>",$tmp[1])."<br>-----------------------<br>"."</body></html>";
$out=str_replace($tmp[1],"",$out);
if(isset($_POST['header'])) $out=$header.$out;
else $out="<html><body class='mainbody'>#</body></html>".$out;
}
else $out="<pre>$out</pre>";
echo $out;
exit("");
}

echo "<?xml version=\"1.0\" encoding=\"windows-1251\"?>";
echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">";

?>

<html>
<
head>
<
title>GP (аналог InetCrack)</title>
<
style type="text/css">
body {
background:black;
color:#009900;
font-size:12pt;
}
.proxy {
margin-bottom:7px;
width:200px;
}
.host {
margin-bottom:7px;
width:200px;
}
.packet {
font-size:8pt;
font-family:courier;
width:400px;
height:300px;
margin-bottom:7px;
}
.tout {
width:30px;
}
.chk {
margin-bottom:7px;
}
.chk_label {
font-size:10pt;
font-family:Courier;
color:white;
cursor:pointer
}
.chk_label:hover {
color:#CCCCCC;
}

</style>
</
head>
<
body>
<
iframe name="gp_frame" style="width:59%; height:100%; float:right; color:black; background:white;" src="http://caricatura.ru/daily/korsun/pic/19.jpg"></iframe>
<
form method="post" target="gp_frame" action="" style="width:40%;">
<
b>[Хост]:[порт]</b><br>
<
input type="text" name="host" class="host"> <b>Ожидание (сек):</b> <input type="text" name="tout" value="30" maxlength="3" class="tout"><br>
<
b>[Прокси]:[порт]</b><br>
<
input type="text" name="proxy" class="proxy"> <br>
<
b>Пакет (GET/POST/etc):</b><br>
<
textarea class="packet" name="packet" rows="20" cols="50"
></textarea>
<
br>
<
input type="submit" value="Отправить запрос">
<
br><br>
<
label class="chk_label"><input type="checkbox" checked="checked" name="header" value="header" class="chk"> Показывать заголовки</label><br>
<
label class="chk_label"><input type="checkbox" checked="checked" name="postlen" value="postlen" class="chk"> Автоподсчет длины POST-данных</label><br>
<
label class="chk_label"><input type="checkbox" checked="checked" name="basehref" value="basehref" class="chk"> Установить <base href> для GET и POST запросов</label><br>
<
label class="chk_label"><input type="checkbox" checked="checked" name="noReload" value="noReload" class="chk"> Запретить автоматическое перенаправление</label><br>

</
form>
</
body>
</
html>




Спустя 3 часа, 43 минуты, 52 секунды (20.11.2010 - 19:39) DySprozin написал(а):
хм... неужели, все настолько ужасно? biggrin.gif

Спустя 2 часа, 17 минут, 20 секунд (20.11.2010 - 21:56) linker написал(а):
Что-то мне подсказывает, ничего кроме http этот скрипт не знает (ftp, pop3 и прочие тут как-то явно не фигурируют).

Спустя 6 минут, 57 секунд (20.11.2010 - 22:03) DySprozin написал(а):
linker
а что мешает задать 110 или 21 порт? (;

уже не говорю об этом куске:
 elseif (preg_match("#^([a-z]+)://([^/]+)[/]+#isU", $host."/", $tmp)==1) { //порт указан через префикс (http(s),ftp)
$host=$tmp[2]; //хост
if($tmp[1]=="http") $port=80; //порт
elseif($tmp[1]=="https") $port=443;
elseif($tmp[1]=="ftp") $port=21;
else exit("<span class='warr'>Я знаю только ftp://, http://, https://</span>");
}

Спустя 31 минута, 29 секунд (20.11.2010 - 22:35) linker написал(а):
Я только мельком глянул пока. FTP не отрабатывает. Завтра мыло проверю.

Спустя 9 минут, 19 секунд (20.11.2010 - 22:44) sharki написал(а):
А для чего он может пригодится? для дебага?)

Спустя 28 минут, 15 секунд (20.11.2010 - 23:12) DySprozin написал(а):
;;А для чего он может пригодится?
ну а для чего телнет пригождается? (; только тут функционал расширен (;

;;FTP не отрабатывает.
а что посылал в запросе? это ведь не ftp-клиент (;

Спустя 1 день, 11 часов, 3 минуты, 38 секунд (22.11.2010 - 10:16) linker написал(а):
Ну как что, посылал
USER ****
PASS ****
LIST
и ничего. Ну ты же говоришь, что твой скрипт работает с различными протоколами.

Спустя 12 часов, 21 минута, 31 секунда (22.11.2010 - 22:37) DySprozin написал(а):
linker
пасиба, буду думать... нет случаем статей, где описана работа с ftp через fsockopen? Или это невозможно?

если (к примеру) заменить в коде

 while((!feof($f))){
$out.=fgets($f,100);
}

на
 while((!feof($f))){
$out.=fgets($f,100);
$ch++;
if($ch>3) {fclose($f); break;}
}


то у мну выдает:

220 Welcome to *** ftp
331 Password required for ***
230 User *** logged in
425 Unable to build data connection: File name too long

Спустя 6 часов, 3 минуты, 42 секунды (23.11.2010 - 04:41) twin написал(а):
Посмотри сюда, что то мне подсказывает, можно попроще решить некоторые моменты.

Спустя 4 часа, 36 минут, 22 секунды (23.11.2010 - 09:17) linker написал(а):
Все протоколы и т.п. очень подробно описываются в соответствующих RFC.

Спустя 3 минуты, 54 секунды (23.11.2010 - 09:21) DySprozin написал(а):
twin
да, зачетная функция, я ее мельком смотрел (;
однако... глючная:
print_r( parse_url("phpforum.ru/index.php?showtopic=36699&hl="));

выдаст:
Array ( [path] => phpforum.ru/index.php [query] => showtopic=36699&hl= )


а я не люблю, когда меня обязывают вводить http:// (;

Спустя 2 часа, 13 минут, 6 секунд (23.11.2010 - 11:34) DySprozin написал(а):
код поправил (первый пост)

пример:

ftp.freebsd.org:21

user anonymous
pass
quit

220 ftp.beastie.tdk.net FTP server (Version 6.00LS) ready.
331 Guest login ok, send your email address as password.
230 Guest login ok, access restrictions apply.
221 Goodbye.


а вот LIST работать не удается заставить ((( с активным/пассивным режимом труба(((


_____________
Господа! Я ненавижу выканье на форумах, обращайтесь ко мне на ты.
Господа! Я буду тоже тыкать, но если это так кого-то из вас коробит, пожалуйста, предупреждайте меня об этом
---
Можешь помочь — помоги, не можешь — попытайся, не хочешь — уйди.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.