Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rodrigo Gms

PROXY Detect 2.0

Recommended Posts

Bom pessoal, fiz este script que detecta se o usuário esta usando proxy, com diversas modalidades.

Basicamente apenas Elite Proxy (super anônimo proxy) conseguiria passar pelo script.

 

<?php
function proxy_detect ($null) {
$proxyports=array(80,8080,6588,8000,3128,3127,3124,1080,553,554);
for ($i = 0; $i <= count($proxyports); $i++) {
if(@fsockopen($_SERVER['REMOTE_ADDR'],$proxyports[$i],$errstr,$errno,0.5)){
$sockport=true;
}
}
if(
   $_SERVER['HTTP_FORWARDED']
|| $_SERVER['HTTP_X_FORWARDED_FOR']
|| $_SERVER['HTTP_CLIENT_IP']
|| $_SERVER['HTTP_VIA']
|| $_SERVER['HTTP_XROXY_CONNECTION']
|| $_SERVER['HTTP_PROXY_CONNECTION']
|| $sockport == true
)
{
return true;
}else{
return false;
}
}

if(proxy_detect($null) == false){
echo 'Nenhum proxy detectado.';
}else{
echo 'Proxy DETECTADO!';
}
?>

 

Recomendo que utilizem apena onde realmente precisa, devido a verificação de cada porta de proxys, ele demora a carregar o script.

Se alguém tiver alguma dica de como melhora-lo ou algo que eu esteja esquecendo, por favor, compartilhe.

 

Testando o script:

Link: http://www.l2ouro.com/proxy.php

Proxys:

http://zend2.com/

http://www.webproxyonline.info/

http://bind2.com/

http://www.nedproxy.com/

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de saber se há sugestões para o meu script, não tenho total certeza se esta correto utilizar este script desta forma, basicamente por ele verificar algumas portas.

Ele funciona muito bem, realmente não deixa nenhum proxy passar, porém me preocupa estar bloqueando usuários que não utilizam estes sistemas.

 

E gostaria de sugestões para deixar o script mais rápido, pelo fato dele verificar uma porta por vez, a verificação é lenta. Não existe uma forma do script verificar todas as portas de uma vez?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um dica que eu posso te dar pra melhorar o desempenho é tirar esse count() do for.

Do jeito que tá, ele vai executar o count() 11 vezes desnecessariamente.

Outra questão é esse <= da condição do for. Com isso ele acaba rodando o looping uma vez mais que o necessário (nesse caso, 11).

 

$count = count($proxyports);

for ($i = 0; $i < $count; $i++) {
...
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ótima observação Haz, obrigado.

Porém, isso não muda muito, o script continua bem lento pelo fato dele levar 0,5 segs para verificar cada porta.

O problema é que o PHP faz uma verificação por vez, não teria como verificar todas as portas de uma so vez?

Tornaria isso bem mais rápido e dinâmico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendo muito dessa parte, mas não haveria a possibilidade de usar curl em vez do fsockopen()? Existem umas funções curl_multi_*(), que não sei se servem pro seu caso, mas fica ai a dica.

 

E qual a finalidade daquele parâmetro $null? Provavelmente vai ser emitido um erro (notice) de variável não definida nessa linha:

if(proxy_detect($null) == false){

 

Outra: uma vez que ele defina $sockport para true, no looping, é necessário continuar testando as outras portas? Senão, breaka lá:

for ($i = 0; $i < $count; $i++) {
 if(@fsockopen($_SERVER['REMOTE_ADDR'],$proxyports[$i],$errstr,$errno,0.5)){
   $sockport=true;
   break;
 }
}

 

Mais uma: Já que esses são os primeiros critérios:

  $_SERVER['HTTP_FORWARDED']
|| $_SERVER['HTTP_X_FORWARDED_FOR']
|| $_SERVER['HTTP_CLIENT_IP']
|| $_SERVER['HTTP_VIA']
|| $_SERVER['HTTP_XROXY_CONNECTION']
|| $_SERVER['HTTP_PROXY_CONNECTION']

Faz essa verificação antes de testar as portas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

o break; ajudou quem usa proxy.. hehe

para quem não usa fica na mesma.

 

mas vou dar uma pesquisada sobre curl_multi.

 

 

Aproveitando sua boa vontade, sabe como posso manter o script executando na memória mesmo se o usuário apertar stop no navegador?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se alguém tiver alguma dica de como melhora-lo ou algo que eu esteja esquecendo, por favor, compartilhe.

 

Eu tenho uma dica pra melhorar um pouco a performance do seu script.

 

Uma boa dica para melhorar a performance é evitar de usar funções dentro de laços de repetição como você fez com a função count.

 

Em vez de usar o loop assim:

 

for ($i = 0; $i <= count($proxyports); $i++) {
if(@fsockopen($_SERVER['REMOTE_ADDR'],$proxyports[$i],$errstr,$errno,0.5)) {
	$sockport=true;
}
}

 

Prefira usar assim:

 

$total = count($proxyports);

for ($i = 0; $i <= $total; $i++) {
if(@fsockopen($_SERVER['REMOTE_ADDR'],$proxyports[$i],$errstr,$errno,0.5)) {
	$sockport=true;
}
}

 

Assim a função count será executada apenas uma vez. É coisa simples, mas se o seu script for executado centenas ou milhares de vezes por dia faz muita diferença. ;)

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se alguém tiver alguma dica de como melhora-lo ou algo que eu esteja esquecendo, por favor, compartilhe.

 

Eu tenho uma dica pra melhorar um pouco a performance do seu script.

 

Uma boa dica para melhorar a performance é evitar de usar funções dentro de laços de repetição como você fez com a função count.

 

Em vez de usar o loop assim:

 

for ($i = 0; $i <= count($proxyports); $i++) {
if(@fsockopen($_SERVER['REMOTE_ADDR'],$proxyports[$i],$errstr,$errno,0.5)) {
	$sockport=true;
}
}

 

Prefira usar assim:

 

$total = count($proxyports);

for ($i = 0; $i <= $total; $i++) {
if(@fsockopen($_SERVER['REMOTE_ADDR'],$proxyports[$i],$errstr,$errno,0.5)) {
	$sockport=true;
}
}

 

Assim a função count será executada apenas uma vez. É coisa simples, mas se o seu script for executado centenas ou milhares de vezes por dia faz muita diferença. ;)

 

Um abraço!

:seta:

 

Um dica que eu posso te dar pra melhorar o desempenho é tirar esse count() do for.

Do jeito que tá, ele vai executar o count() 11 vezes desnecessariamente.

Outra questão é esse <= da condição do for. Com isso ele acaba rodando o looping uma vez mais que o necessário (nesse caso, 11).

 

$count = count($proxyports);

for ($i = 0; $i < $count; $i++) {
...
}

 

?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal eu estou com um probleminha.

 

Andei pesquisando cobre cURL, fiz um script que aparentemente era para funcionar tudo ok, porém, pelo que parece ser um erro do próprio PHP não funciona.

 

Segue o script:

<?php
$proxyports=array(80,8080,6588,8000,3128,3127,3124,1080,553,554);
$mh = curl_multi_init();
$count = count($proxyports);
for ($i = 0; $i < $count; $i++) {
$ch[$i] = curl_init();
curl_setopt($ch[$i], CURLOPT_URL, $_SERVER['REMOTE_ADDR']);
curl_setopt($ch[$i], CURLOPT_PORT, $proxyports[$i]);
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch[$i], CURLOPT_CONNECTTIMEOUT, 1);
curl_setopt($ch[$i], CURLOPT_TIMEOUT, 1);
curl_multi_add_handle($mh,$ch[$i]);
}

$running=null;
do {
   curl_multi_exec($mh,$running);
} while ($running > 0);

for ($i = 0; $i < $count; $i++) {
if(curl_errno($ch[$i]) == 7 || curl_errno($ch[$i]) == 28){
$sockport=false;
}else{
$sockport=true;
break;
}
curl_multi_remove_handle($mh, $ch[$i]);
}

curl_multi_close($mh);

if($sockport == false){
echo 'Nenhum proxy detectado.';
}else{
echo 'Proxy DETECTADO!';
}
?>

 

o problema esta em curl_errno(), ele funciona perfeitamente com curl_exec() agora quando se trata de curl_multi_exec() ele sempre retorna "0" (= tudo funcionou como deveria) mesmo quando não funciona.

 

alguém tem uma idéia de como contornar isso ou se estou fazendo algo errado?

eu já tenho um conhecimento grande em PHP e estou em duvida nisso, se alguem souber como resolver isso, irei considerar esta pessoa expert. fica ai o desafio (mas realmente acho que não tem solução).

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.