webProxy feito em PHP
Publicado por Marcus Fazzi 26/03/2004
[ Hits: 15.169 ]
Este pequeno script PHP inplementa um webProxy, com suporte apenas ao protocolo HTTP na porta 80, mas mostra muitas técnicas de programação em PHP.
O script é totalmente orientado a objetos, possuindo o arquivo principal index.php e a classe webproxy.php
A licença deste script é BSD!
):-)
---------------->index.php <?php require 'webproxy.php'; //tempo ilimitado de script.... @set_time_limit(200); $wproxy = new WebProxy; if ($_GET['xurl']!='') { $wproxy->browser = $HTTP_SERVER_VARS["HTTP_USER_AGENT"]; $wproxy->web_self = $HTTP_SERVER_VARS["PHP_SELF"]; $wproxy->web_proxy = $HTTP_SERVER_VARS["HTTP_HOST"] . $wproxy->web_self; $wproxy->params = $_GET; $wproxy->url = $_GET['xurl']; $wproxy->getport(); $wproxy->getserver(); $wproxy->showresult(); } else { echo $wproxy->showbanner(); ?> <br></b> <link rel="stylesheet" href="./webproxy.css"> <form action='index.php' method="get"> <pre><img src="fzz.gif">URL:<input type="text" name="xurl" size="60"> <input type="submit" value="Go!"></pre> </form> <?php } ?> ------------------------> webproxy.php <?php define('WEB_PROXY','0.9.9.4b'); //to-do: verificar se tirando o :PORTA da url ela abre no webproxy.... //to-do: multiple form support... class WebProxy { var $url; //url to get... var $port; //port to connect... var $server; var $web_proxy; var $browser; var $protocol; var $page; var $svr_path; var $params; //Objetos que não levam o cabeçalho... var $objects = array('.jpg','.jpeg','.gif','.png','.css','.swf','.js','.zip','.gz','.tar','.rar','.exe','.pdf','.xls','.doc','.ppt','.mpg','.mpeg','.mp3','.mid','.midi','.wav','.java','.jar','.class','.xml','.css'); //Objetos binarios. var $bin_objects = array('.zip','.gz','.tar','.rar','.exe','.pdf','.xls','.doc','.ppt','.mpg','.mpeg','.mp3'); function showbanner() { $st0 = $this->url!= ''? " , opening: '$this->url' on port: '$this->port'</font>":''; return "<table border='0' bgcolor='AFAFD8' align='center' width='100%'><tr bgcolor='004080'><td><b><font size=2 color='AFAFD8'>WebProxy v" . WEB_PROXY . " by Fazzi.net</b>$st0<br> <a style='COLOR:AFAFD8;' href='./'>:: Go Home :: <img border='0' src='home.gif'></a></td></tr></table>\n"; } function getport() { $pp = explode('://',$this->url); $this->protocol = $pp[0]; $this->page = $pp[1]; switch ($this->protocol) { case 'http': $p = 80; break; case 'https': $p = 443; break; default: $p = 21; die('<b>WebProxy ERROR</b>: this version don\'t supports this protocol.'); break; } //get alternate ports... $pp = explode('/',$pp[1]); $port = explode(':',$pp[0]); $this->port = $port[1]!=''?$port[1]:$p; } function getserver() { $pp = explode('://',$this->url); $pp = explode('/',$pp[1]); $this->server = $pp[0]; $this->svr_path = $pp; $this->ext = strtolower(strrchr($this->url,'.')); } function showresult() { $data = ""; $fp = fsockopen($this->server,$this->port); if ($fp) { //patch 1.00 $n_vars = count($this->params); //from a form? if ($n_vars > 1) { $keys = array_keys($this->params); //$cg = '?'; for ($i=0; $i<$n_vars; $i++) { $eta = $i==0?'':$keys[$n_vars-$i-1] . '='; $new_url .= $cg . $eta . $this->params[$keys[$n_vars-$i-1]]; $cg = $i<1?'?':'&'; } $this->url = $new_url; } //fim patch 1.00 fputs($fp, "GET $this->url" . "\r\n\r\n"); $this->bin_head(); while (!feof($fp)) { if (!(in_array($this->ext,$this->objects))) { $data .= fread($fp, 1024); } else { echo fread($fp, 1024); } } fclose($fp); } else { echo "<b>WebProxy ERROR</b>: Can not connect to server.<br>"; } if (!(in_array($this->ext,$this->objects))) { echo $this->showbanner(); $data = $this->data_replace_links($data); echo $this->web_replace_title($data); } unset($data); } function web_replace_title($data) { if ($pos = strpos($data,'<title>') + strpos($data,'<TITLE>')) { return substr_replace($data,'WebProxy v' . WEB_PROXY . ' :: ' , $pos + 7, 0); } else { return substr_replace($data,'<title>WebProxy v' . WEB_PROXY . ' :: No Title</title>' , 0, 0); } } function data_replace_links($data) { $data = str_replace('./','',$data); $data = str_replace('http://','http://' . $this->web_proxy . '?xurl=http://',$data); $data = str_replace('="./','="' . 'http://' . $this->web_proxy . '?xurl=' . $this->url,$data); $data = str_replace("='./","='" . 'http://' . $this->web_proxy . '?xurl=' . $this->url,$data); $data = $this->tag_replace($data,'src'); $data = $this->tag_replace($data,'href'); $data = $this->form_replace($data); //$data = $this->tag_replace($data,'action'); return $data; } //patch 1.00 function form_replace($data) { $tag = 'action'; $sup_tag = substr_replace($tag,'Fzz',0,1); $len = strlen($data); $len_tag = strlen($tag); $pos_atual = 0; while ($pos_atual!=$len) { if ($pos = strpos($data,' ' . $tag)) { $st = substr($data,$pos,$len_tag + 10); //>>>>>>>>>>>>>> $pos_2 = strpos($st,"'") + strpos($st,'"'); $z = $pos_2 ? 1 : 0; $pos_2 = $pos_2==0? strpos($st,'='):$pos_2; $form_tmp = substr($data,$pos + $pos_2 + 1 ,1024); if ($z) { $pos_3 = strpos($form_tmp,'"') + strpos($form_tmp,"'"); } $pos_3 = $pos_3==0?strpos($form_tmp,' ')+1:$pos_3; $pos_3 = $pos_3==0?strpos($form_tmp,'>')+1:$pos_3; unset($form_tmp); $form_action = substr($data, $pos + $pos_2 + 1,$pos_3); if ($pos_4 = strpos($form_action,'?')) { $form_action = substr($form_action,$pos_4 + 6, strlen($form_action)- $pos_4 + 6); } $stpp = ''; $st3 = ''; $k = count($this->svr_path); $kk = strlen($form_action); if (substr($form_action,0,7)!='http://') { if (substr($form_action,0,1)=='/') { $stpp = $this->server; $stpp = str_replace('//','/',$stpp); $form_action = 'http://' . $stpp . $form_action; } else { for ($i=0;$i<$k-1;$i++) { $stpp .= $this->svr_path[$i] . '/'; } $stpp = str_replace('//','/',$stpp); $form_action = 'http://' . $stpp . $form_action; } } $form_action = "<input type='hidden' name='xurl' value='$form_action'>"; //$data = substr_replace($data,' ' . $form_action, $pos_5 + 1 ,0); if ($pos_5 = strpos($data,'</form>')) { $data = substr_replace($data, ' ' . $form_action . '</fzzorm>', $pos_5,7); } //>>>>>>>>>>>>>>> $st2 = str_replace(' ','',$st); if (substr($st2,$len_tag,1)=='=') { $c = substr($st2,$len_tag+1,1); $passo = 1; if ($c!="'" and $c!='"') { $c = ''; } $br = substr($st2,$len_tag+2,1); if (substr($st2,0,$len_tag + 9)!=$tag . '=' . $c . 'http://') { //pega a posição da " if ($c!='') { $x = strpos($st,$c); } else { $x = strpos($st,'='); } $stpp = ''; $st3 = ''; if ($br!='/') { for ($i=0;$i<$k-1;$i++) { $stpp .= $this->svr_path[$i] . '/'; } $stpp = str_replace('//','/',$stpp); $st3 = $this->web_proxy; } elseif ($br=='/') { $stpp = $this->server; $stpp = str_replace('//','/',$stpp); $st3 = $this->web_proxy; } $l = strlen($st3); $st3 = 'http://' . str_replace('//','/',$st3); $data = substr_replace($data,$st3,$pos+$x+$passo,$kk); } } $data = substr_replace($data,' ' . $sup_tag,$pos,$len_tag+1); } else { $pos_atual = $len; } } $data = str_replace('="post"','="get"',$data); $data = str_replace("='post'","='get'",$data); $data = str_replace("</fzzorm>","</form>",$data); return str_replace(' ' . $sup_tag,' ' . $tag,$data); } function tag_replace($data,$tag) { $sup_tag = substr_replace($tag,'Fzz',0,1); $len = strlen($data); $len_tag = strlen($tag); $pos_atual = 0; while ($pos_atual!=$len) { if ($pos = strpos($data,' ' . $tag)) { $st = substr($data,$pos,$len_tag + 10); $st2 = str_replace(' ','',$st); if (substr($st2,$len_tag,1)=='=') { $c = substr($st2,$len_tag+1,1); $passo = 1; if ($c!="'" and $c!='"') { $c = ''; } $br = substr($st2,$len_tag+2,1); if (substr($st2,0,$len_tag + 9)!=$tag . '=' . $c . 'http://') { //pega a posição da " if ($c!='') { $x = strpos($st,$c); } else { $x = strpos($st,'='); } $stpp = ''; $k = count($this->svr_path); $st3 = ''; if ($br!='/') { for ($i=0;$i<$k-1;$i++) { $stpp .= $this->svr_path[$i] . '/'; } $stpp = str_replace('//','/',$stpp); $st3 = 'http://' . $this->web_proxy . '?xurl=http://' . $stpp; } elseif ($br=='/') { $stpp = $this->server; $stpp = str_replace('//','/',$stpp); //$stpp = substr($stpp,strlen($stpp)-1,1)=='/'?substr($stpp,0,strlen($stpp)-1):$stpp; $st3 = 'http://' . $this->web_proxy . '?xurl=http://' . $stpp; } $l = strlen($st3); $data = substr_replace($data,$st3,$pos+$x+$passo,0); } } $data = substr_replace($data,' ' . $sup_tag,$pos,$len_tag+1); } else { $pos_atual = $len; } } return str_replace(' ' . $sup_tag,' ' . $tag,$data); } function bin_head() { if (in_array($this->ext,$this->bin_objects)) { $k = count($this->svr_path); $arquivo = $this->svr_path[$k-1]; //$size = strlen($data)*8; switch ($this->ext) { case '.pdf': header("Content-type: application/pdf\n"); break; case '.doc': header("Content-type: application/msword\n"); break; case '.xls': header("Content-type: application/vnd.ms-excel\n"); break; case '.ppt': header("Content-type: application/vnd.ms-powerpoint\n"); break; case 'mpg': header("Content-type: audio/mpeg\n"); break; case 'mpeg': header("Content-type: audio/mpeg\n"); break; case 'mp3': header("Content-type: audio/mpeg\n"); break; default: header("Content-type: application/octet-stream\n"); } if (strstr($this->browser, "MSIE")) { header("Content-Disposition: filename=$arquivo" . "%20" . "\n"); // for IE } else { header("Content-Disposition: attachment; filename=$arquivo" . "\n"); //other browsers } //header("Content-Length: " . $size . "\n"); header("Content-transfer-encoding: binary\n"); header("Pragma: no-cache" . "\n"); } } } ?>
Resolvendo IP para Hostname em PHP
Script PHP para autenticacao web dos usuarios do proprio linux
PortScan em PHP com post usando fsockopen
Cria gráficos para monitoramento de consumo de CPU e Memória a partir de arquivos [Atualização].
Script PHP para fazer UPLOAD de arquivos
Subindo o Zabbix e Grafana no Podman com Pod
Habilitar a aceleração por hardware AMD AMF no OBS
Roubando bits (parte 2): como resolver questões rapidamente sem calculadora
Usando Linux para operar plataformas de análise gráfica na Bovespa (B3)
Instalando Google Chrome no Ubuntu 22.04 LTS
Bodhi Linux: melhor distro Linux para Atom N455
Solução Touchpad Notebook Lenovo S145
abrir mesmo software 2 vezes em usuarios diferentes (3)
Apaguei alguns usuários que compartilhavam as mesmas pastas [desespera... (0)
linux-image-5... : Depende: linux-modules... mas não será instalado (13)