• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kingless

[PHP]PHP Proxy

17 mensagens neste tópico

Estou a tentar desenvolver um proxy em PHP sem utilizar a biblioteca CURL o código ainda tem muitos erros por isso se alguém arranjar alguns erros poste aqui as modificações.

Source Code:

http://www.kingless.net/download.php?filename=proxy.php;source'>http://www.kingless.net/download.php?filename=proxy.php;source

Download:

http://www.kingless.net/download.php?filename=proxy.php

Demo:

http://www.kingless.net/proxy.php

<?php
      ///////////////////////////////
     ///////  PHP Proxy 1.0  ///////
    //////    (Alpha)        //////
   /////   By kingless       /////
  ///////////////////////////////
/// http://www.kingless.net ///
///////////////////////////////

$proxy = new PHP_PROXY( @$_REQUEST['url'], @$_REQUEST['method'] );

class PHP_PROXY {

var $proxy_site =  "";
var $scheme = 'http';
var $host;
var $query = '';
var $port = 80;
var $user = '';
var $pass = '';
var $path = '/';
var $fragment = '';
var $error = array();
var $proxy = null;
var $timeout = 30;
var $method = "GET";
var $httpver = "1.0";
var $sendtimeout = 5;

function PHP_PROXY( $url = '', $method = "GET") {

	if(!empty( $url ) AND !eregi( '^(http|https):\/\/', $url )) {
		if(!eregi('^www\.', $url )) {
			$url = 'http://www.'. $url;
		} else {
			$url = 'http://'. $url;
		}
	}

	$this->parse_url( $url );

	if(empty( $this->proxy_site )) {
		$this->proxy_site = "http://". $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
	}

	if(!isset( $_REQUEST['conectar'] ) AND !isset( $_REQUEST['url'] )) {
		echo $this->html( $this->proxy_site );
		return;
	}

	$this->method = $method;

	$this->start();
}

function html( $url = '', $method = 'GET', $formMethod = 'GET', $content = '' ) {

	if(empty( $url )) {
		$url = $this->proxy_site;
	}

	$html[] = '<html><head><title>PHP Proxy 1.0 by kingless</title></head><body>';
	$html[] = '<center><span style="font-size: 1em; font-family: arial, verdana, sans-serif;">PHP Proxy 1.0</span></center><br />';
	$html[] = '<form action="'. $url .'" method="'. $formMethod .'">';
	$html[] = '<table align="center"><tr>';
	$html[] = '<td>Site: </td><td><input style="border: 1px solid silver" type="text" name="url" /></td></tr>';
	$html[] = '<input type="hidden" name="method" value="'. $method .'" />';
	$html[] = '<tr><td colspan="2" align="right"><input style="border: 1px solid gray" type="submit" name="conectar" value="Conectar" /></td></tr>';
	$html[] = '</table></form>';

	if(!empty( $content )) {
		$html[] = "<br />$content";
		$html[] = '</body></html>';
	}

	return implode( "\r\n", $html );
}

function parse_url( $url ) {
	foreach(parse_url( htmlentities( $url )) as $key => $value) {
		$this->$key = $value;
	}
}

function start() {

	$this->proxy_connect();

	if(!$this->is_connected()) {
		die( $this->error() );
	}

	$this->sendHeaders();

	$data = $this->getData();

	$data = $this->processHTML( $data );
}

function proxy_connect() {

	$proxy = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);

	$this->error[$errno] = $errstr;

	$this->proxy = $proxy;
}


function is_connected() {
	if(is_null( $this->proxy ) and !empty( $this->error )) {
		return false;
	}
	return true;
}

function sendHeaders() {

	$headers = '';

	switch( $this->method ) {
		case "GET":
		$headers = "$this->method $this->path$this->query HTTP/$this->httpver\r\n";
		break;
		case "POST":
		$headers = "$this->method $this->path HTTP/$this->httpver\r\n";
		break;
	}

	$headers .= "Host: $this->host\r\n";
	$headers .= "User-Agent: PHP-PROXY/1.0 By kingless (+http://www.kingless.net)\r\n";
	$headers .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"; 
	$headers .= "Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
	$headers .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
	$headers .= "Keep-Alive: 300\r\n";
	$headers .= "Referer: $this->scheme://$this->host$this->path$this->query\r\n";

	if($this->method == "POST") {
		$headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
		$headers .= "Content-Length: ". strlen( $this->query ) ."\r\n";
		$headers .= urlencode( $this->query ) ."\r\n";
	}

	$headers .= "Connection: Keep-Alive\r\n\r\n";

	fputs( $this->proxy, $headers );

	stream_set_timeout($this->proxy, $this->sendtimeout);
}


function getData() {

	$content = '';

	do {
		$data = fread($this->proxy, 4096);

		if (strlen($data) == 0) {
			break;
		}
		$content .= $data;
	} while(true);

	return $content;
}

function processHTML ( $data ) {

	$data = utf8_decode( $data );

	$href = preg_split( '/<a(.*?)href=("|\')?/i', $data );
	$src = preg_split( '/<img(.*?)src=("|\')?/i', $data );

	$links = array();
	$img = array();
	$pattern = array();
	$replace = array();

	for($x = 1; $x < count( $href ); $x++) {
		$links = explode( '"', $href[$x] );
		$link = $links[0];

		$pattern[] = '/'. preg_quote( $link, "/" ) .'/';

		if(substr( $link, 0, 1) == '/') {
			$url = "http://".$this->host.$link;
			$replace[] = $this->proxy_site."?url=".$url;
		} elseif(substr( $link, 0, 4 ) == 'www.') {
			$url = "http://".$link;
			$replace[] = $this->proxy_site."?url=".$url;
		} else {
			$replace[] = $this->proxy_site."?url=".$link;
		}
	}

	for($x = 1;$x < count( $src ); $x++) {
		$img = explode( '"', $src[$x] );	
		$link = $img[0];

		if(!eregi( '^http:\/\/', $link )) {
			$pattern[] = '/'. preg_quote( $link, "/" ) .'/';
		}

		if(substr( $link, 0, 1 ) == '/') {
			$replace[] = "http://". $this->host.$link;
		} elseif( !eregi( '(http|https|www)', $link )) {
			$replace[] = "http://". $this->host.$this->path.$link;
		}
	}

	$form['action'] = preg_split( '/<form(.*?)action=("|\')?/i', $data );
	$form['method'] = preg_split( '/<form(.*?)method=("|\')?/i', $data );

	for($x = 1;$x < count( $form['action'] );$x++) {

		$action = explode( '"', $form['action'][$x] );
		$method = explode( '"', $form['method'][$x] );

		$action = urlencode( $action[0] );
		$method = urlencode( $method[0] );

		$pattern[] = '/'. preg_quote( $action, "/" ) .'/';

		if(eregi( 'post', $method )) {
			$pattern[] = '/'. preg_quote( $method, "/" ) .'/';
			$replace[] = 'get';
		}

		if(substr( $action, 0, 1) == '/') {
                                $url = "http://".$this->host.$action;
                                $replace[] = $this->proxy_site."?url=".$url;
                        } elseif(substr( $action, 0, 4 ) == 'www.') {
                                $url = "http://".$action;
                                $replace[] = $this->proxy_site."?url=".$url;
                        } else {
                                $replace[] = $this->proxy_site."?url=".$action;
                        }
	}

	$pattern = array_unique( $pattern );
	$replace = array_unique( $replace );

	$data = preg_replace( $pattern, $replace, $data );

	echo $this->html( $this->proxy_site, 'GET', 'GET', $data );
}

function error() {

	if(!is_array( $this->error )) {
		return false;
	}

	foreach( $this->error as $number => $error ) {
		return "$error ($number)";
	}
}
}
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

peço desculpa pela ignorancia mas o que é que isso faz ao certo ?

PS tas em força KINGless;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

http://pt.wikipedia.org/wiki/Proxy

Com este script podes entrar em vários sites sem mostrares o teu IP verdadeiro em vez de entrares em sites com o teu IP entras com o IP da maquina onde o script do proxy esta alojado...

Para testares o script podes fazer o seguinte:

http://www.kingless.net/proxy.php?url=http://www.ip-adress.com&method=GET&conectar=Conectar  <-- Em vez de mostrar o teu IP verdadeiro vai mostrar outro IP

Mas se fores ao site

http://www.ip-adress.com/      <-- Vai mostrar o teu IP verdadeiro

Uma das situações em que este script pode ser útil é quando queres entrar em um website sem seres identificado...

EDIT:

Oops! Dei o URL do site errado  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resta dizer que estes proxys nunca devem ser usados em um site com autenticação. Tipo conta de mail Google.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resta dizer que estes proxys nunca devem ser usados em um site com autenticação. Tipo conta de mail Google.

Porquê que estes proxys "nunca" devem ser usados em um site com autenticação ?

PS: Com o meu script também ainda não é possível fazer autenticação em sites... mas já estou a modificar o código para tornar isso possível 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, mas não vale apena tornar isso possivel, a não ser que queiras apanhar as passwords da malta.

O certificados não funcionam com proxys, e embora a mensagem de Certificado inválido possa aparecer, existe muita gente por ai que não liga nada a isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, mas não vale apena tornar isso possivel, a não ser que queiras apanhar as passwords da malta.

Espera.. deixa-me ver se entendi.. tu estas a tentar dizer que eu quero apanhar as passwords da malta ?

Faz-me um favor senhor... lê o código PHP e diz-me se existe algum código no PHP que permite "apanhar as passwords da malta"

O certificados não funcionam com proxys, e embora a mensagem de Certificado inválido possa aparecer, existe muita gente por ai que não liga nada a isso.

Este script é basicamente um file_get_contents este script  nem devia se chamar proxy mas como faz algo parecido com um proxy decidi chamar PHP-Proxy. (não confundas este script com estes proxys que andam por ai)

btw, se quisesse permitir a autenticação em websites com certificados só precisava de utilizar a biblioteca CURL.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O certificado nunca vai ser válido para o objectivo que queres.

Não estou a dizer que pretendas apanhar as passwords da malta. Só digo que isso não vale apena fazer porque não inspira confiança, também não queres que o pessoal confie cegamente nesses proxys.

Se não inspira confiança, ninguem no seu perfeito juizo o vai usar nesse tipo de sites.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O certificado nunca vai ser válido para o objectivo que queres.

Não sei se já conheces algumas opções SSL do CURL ... se ainda não conheces tenta saber mais sobre elas...

CURLOPT_SSLCERT, CURLOPT_SSLCERTPASSWD, CURLOPT_SSL_VERIFYHOST, CURLOPT_SSLVERSION, CURLINFO_SSL_VERIFYRESULT, CURLOPT_SSL_CIPHER_LIST...

Mas pode ser que eu esteja enganado por isso não vou discutir mais acerca disso :P

Não estou a dizer que pretendas apanhar as passwords da malta. Só digo que isso não vale apena fazer porque não inspira confiança, também não queres que o pessoal confie cegamente nesses proxys.

Se não inspira confiança, ninguem no seu perfeito juizo o vai usar nesse tipo de sites.

Vou ser mais directo... Isto não é um Proxy isto é um script PHP...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas onde vai ser usado o Curl? No script PHP?

O que estas a fazer é um tipo de "men in the middle".

Já agora gostava de saber como é que vaz conseguir deixar passar o certificado lançado pelo server (destino), até ao cliente, sem o invalidar. Já que o URL não pode ser o mesmo quando estás a aceder pelo suposto "proxy".

Também posso estar enganado. Não leves isto como um ataque.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas onde vai ser usado o Curl? No script PHP?

Eu não vou usar CURL só disse que se quisesse permitir a autenticação em websites com certificados só precisava de utilizar a libCurl.... Mas se usasse ia ser no script PHP

O que estas a fazer é um tipo de "men in the middle".

Não...

Já agora gostava de saber como é que vaz conseguir deixar passar o certificado lançado pelo server (destino), até ao cliente, sem o invalidar. Já que o URL não pode ser o mesmo quando estás a aceder pelo suposto "proxy".

Quando um utilizador insere uma URL no script PHP e acede a um site a URL do site (não a do site do proxy) fica guardada em variaveis da classe e quando quiser saber qual é a URL do site para usar no CURL só preciso de chamar variavel que tem a URL do site e inserir no CURL a URL... aqui fica um exemplo para facilitar

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,  $this->host );  //$this->host tem a URL do site (exemplo: gmail.com)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
//E por ai fora...
$data = curl_exec ($ch);
curl_close ($ch);

É mais ou menos isso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

kingless, o shumy tem razão. O endereço que te vai fornecer o certificado é o do sítio onde tens o script e não o endereço "correcto" por assim dizer. O browser ao tentar validar vê que são != e considera inválido. Para o browser, o que estás a fazer é um MITM.

Para veres se um site está online sem revelares quem és, esse script dá jeito, mas para utilização no dia a dia, não tens sucesso :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

kingless, o shumy tem razão. O endereço que te vai fornecer o certificado é o do sítio onde tens o script e não o endereço "correcto" por assim dizer. O browser ao tentar validar vê que são != e considera inválido. O que estás a fazer é um género de MITM.

Yep...  :P

http://www.google.pt/adsense

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para veres se um site está online sem revelares quem és, esse script dá jeito, mas para utilização no dia a dia, não tens sucesso :P

Não concordo... quando eu acabar este script vai ser possível navegar por um site inteiro sem ser identificado e não apenas para "ver se um site esta online"

Se quisesse apenas ver se um site esta online só precisava de utilizar a função file_get_contents, não achas?  :wallbash:

alias.. já é possível navegar por um site sem ser identificado com este script só não é possível fazer logins ou seja usar formulários

Já agora encontrei um "proxy" PHP que funciona bem... se quiseres ter uma ideia de como o meu script vai funcionar podes testar http://sourceforge.net/projects/phpproxy/

Mas só que esse script utiliza a biblioteca CURL...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não concordo... quando eu acabar este script vai ser possível navegar por um site inteiro sem ser identificado e não apenas para "ver se um site esta online"

Se quisesse apenas ver se um site esta online só precisava de utilizar a função file_get_contents, não achas?  :wallbash:

Tu ainda não percebeste. O que eu dei foi um exemplo simples. Para veres o que existe no P@P, podes usar isso, mas para fazer uma utilização normal (postar), não vais usar de certeza. :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tu ainda não percebeste. O que eu dei foi um exemplo simples. Para veres o que existe no P@P, podes usar isso, mas para fazer uma utilização normal (postar), não vais usar de certeza. :P

Da forma como disseste "ver se site esta online" não deu para perceber isso mas pronto... parece que deves em quando tenho alguns problemas em perceber português por isso peço-te que da próxima vez sejas um bocadinho mais directo. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tu ainda não percebeste. O que eu dei foi um exemplo simples. Para veres o que existe no P@P, podes usar isso, mas para fazer uma utilização normal (postar), não vais usar de certeza. :P

Da forma como disseste "ver se site esta online" não deu para perceber isso mas pronto... parece que deves em quando tenho alguns problemas em perceber português por isso peço-te que da próxima vez sejas um bocadinho mais directo. :)

Mi culpa. Espero que tenhas compreendido agora. :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora