pais - Detectar clientes con servidores proxy a través de PHP
obtener ip php (10)
Creo que lo que está sucediendo aquí es algo de JavaScript del lado del cliente que está tratando de cargar algo, y que puede "ver" que la página se está viendo dentro de un marco. Esa podría ser una vía más fructífera para explorar, como han indicado otras respuestas, los proxies intencionalmente hacen que sea difícil determinarlo solo desde el servidor.
Estoy buscando un método, o una forma de detectar clientes utilizando cualquier tipo de servidor proxy viendo mi sitio web. Estoy usando PHP / Apache ... ¿cuál es la mejor manera de hacer esto? Cualquier servidor proxy debería ser detectado, no específicamente uno u otro.
Editar
Estoy más interesado en los proxies anónimos ... ya que los normales se detectan fácilmente al buscar HTTP_X_FORWARDED_FOR
.
Otro Editar
Prueba esto:
1) ir a http://kproxy.com (o cualquier otro sitio proxy anónimo gratuito)
2) visita: http://www.worldofwarcraft.com
3) son capaces de bloquear de alguna manera, ya que la página se equivoca con "Error al cargar la hoja de estilo: se produjo un error de red al cargar una hoja de estilo XSLT: http://kproxy.com/new-hp/layout/layout.xsl "
Quiero hacer algo similar para evitar proxies.
No puedes detectarlo a menos que pasen encabezados especiales que explícitamente lo mencionan como X-Forwarded-For o algo así.
Por lo que sé, debes usar una lista negra. Los usuarios que usan putty portforwarding, VPN u otros métodos más sofisticados son indetectables, ya que se comportan exactamente como los usuarios normales.
Todo lo que el cliente transfiere al servidor se puede configurar por sí mismo. No puedes confiar en nada, excepto en una dirección IP. Por lo tanto, no puede verificar los datos del encabezado, si es un proxy o un cliente normal.
Por cierto: es la intención de un proxy no mostrar ser un proxy :)
Por supuesto, podría tomar la dirección IP del solicitante y enviar una solicitud http que enviaría a un proxy. Si reacciona, puede ser un proxy, de lo contrario, es un cliente normal. Este método sería muy costoso y no confiable. Si el proxy que solicitó su servidor estaba detrás de un firewall, no obtendría respuesta y pensaría que es un cliente normal.
Metasploit utiliza muchas técnicas diferentes para forzar al sistema del cliente a establecer una conexión directa (vulnerabilidades / características incorrectas en Flash, Java, QuickTime, MS Office, servidor DNS personalizado).
Alternativamente, si no puede lograr que el navegador del cliente inicie metasploit, podría intentar buscar proxies abiertos (escaneo de puertos) y nodos conocidos de salida Tor .
Pero no asuma que los proxies son malvados y necesitan ser bloqueados: hay muchos proxies legítimos y algunos usuarios tienen que usarlos.
Si tiene problemas con el spam u otro tráfico abusivo, el solo bloqueo de proxies no ayudará mucho. Debe buscar soluciones específicas que aborden el núcleo del problema (filtros de spam, IDS) en lugar de asumir anonymous = guilty.
Estoy usando lo siguiente, pero no estoy seguro de si está funcionando todo el tiempo. Es solo una idea :)
<?php
$host = gethostbyaddr($_SERVER[''REMOTE_ADDR'']);
if ($host != $_SERVER[''REMOTE_ADDR'']) die(''Proxy detected.'');
?>
Use las siguientes 2 soluciones en PHP. // methode 1 = rápido pero no funciona con proxies anónimos
$proxy_headers = array(
''HTTP_VIA'',
''HTTP_X_FORWARDED_FOR'',
''HTTP_FORWARDED_FOR'',
''HTTP_X_FORWARDED'',
''HTTP_FORWARDED'',
''HTTP_CLIENT_IP'',
''HTTP_FORWARDED_FOR_IP'',
''VIA'',
''X_FORWARDED_FOR'',
''FORWARDED_FOR'',
''X_FORWARDED'',
''FORWARDED'',
''CLIENT_IP'',
''FORWARDED_FOR_IP'',
''HTTP_PROXY_CONNECTION''
);
foreach($proxy_headers as $x){
if (isset($_SERVER[$x])) die("You are using a proxy!");
}
// Methode 2 = portscan vuelve a la IP de origen en los puertos proxy normales utilizados.
$ports = array(8080,80,81,1080,6588,8000,3128,553,554,4480);
foreach($ports as $port) {
if (@fsockopen($_SERVER[''REMOTE_ADDR''], $port, $errno, $errstr, 30)) {
die("You are using a proxy!");
}
}
Viejo tema, pero podría haber descubierto algo.
Está en vivo en mi sitio y creo que podría funcionar en la mayoría de los casos.
Mi problema era que el usuario bloqueado volvía a mi sitio y volvía a registrarse con una nueva dirección de correo electrónico usando uno de los muchos proxies que puede encontrar. Lo que hice fue una simple llamada jQuery en el formulario de registro / inicio de sesión:
<form id="login_form" method="post" action="/#fake_login_url">
stuff you need for the form
</form>
<script>
$(''#login_form'').attr(''action'',''real_login_form'');
</script>
Este sitio web muestra este error porque tiene en su código fuente una dirección que apunta a "new-hp / layout / layout.xsl". Un proxy quiere ocultar su ip, por lo que la está cambiando a http://kproxy.com/new-hp/layout/layout.xsl , para que apunte a su servidor, pero el archivo no está realmente existente, por lo que Flash Plugin puede no lo encuentras
Hay varias soluciones pagas / gratuitas. La mayoría de ellos mira la dirección IP del cliente que intenta conectarse para determinar si están en un proxy o no.
Pagado:
Maxmind : se centran en la detección de fraudes y tienen una subcategoría para la detección de proxy. Tenga en cuenta que esto ahora se considera un servicio "heredado".
Gratis:
WITCH - Capaz de detectar OpenVPN mirando valores de MSS que son identificables de forma única. El código está disponible en github.
GetIpIntel - Detección de Proxy / VPN mediante aprendizaje automático, consultas vía API.
Hay algunas opciones gratuitas más enumeradas en el intercambio de pila de seguridad .
Siento que responder un hilo de 8 años es inútil, pero responderé de todos modos para futuras referencias.
No sé sobre los proxies, pero la mayoría de las VPN (si vas a ellos) traerán algún tipo de página de error. si hiciste algo como ...
$cont = file_get_contents($_SERVER["REMOTE_ADDR"]); //the users ip
$errormsg = "nginx";
if(strpos($cont, $errormsg)){
die("No VPN''s or Proxies Allowed");
}
esto es muy básico, podría obtener una serie de mensajes de error y hacerlo de esa manera.
Esto no funcionará si el usuario ha portado su puerto 80, pero no veo por qué la persona común haría esto.