usar - tor venezuela
¿Es posible bloquear a los usuarios de Tor? (11)
(Esto fue escrito para una pregunta específica de PHP que posteriormente se eliminó y se vinculó aquí como un duplicado).
Descargo de responsabilidad: considere el impacto de bloquear a todos los usuarios de Tor como se planteó en la mejor respuesta aquí. Considere solo las funciones de bloqueo, tales como el registro, el pago, los comentarios, etc. y no un bloque general en todo.
-
Aquí hay dos soluciones puras de PHP. Las primeras descargas y almacena en caché una lista de nodos Tor y compara la IP del visitante con la lista. El segundo usa el proyecto https://www.torproject.org/projects/tordnsel.html.en para determinar si el visitante está usando Tor a través de búsquedas DNS.
Método n. ° 1 (Comprobación de IP contra una lista de retransmisión Tor):
Usando el siguiente conjunto de funciones, podemos determinar si un IP pertenece a la red Tor, al compararlo con una list dinámica que se descarga y almacena en caché durante 10 minutos. Siéntase libre de usar esta lista, pero por favor guarde en caché durante 10 minutos cuando sea posible.
Donde quiera aplicar el control Tor, simplemente puede usar:
$isTorUser = isTorUser($_SERVER[''REMOTE_ADDR'']);
if ($isTorUser) {
// blocking action
}
Aquí está el código que puede colocar en un archivo de funciones separado e incluirlo cuando quiera ejecutar el cheque. Tenga en cuenta que es posible que desee ajustar algunos de ellos para cambiar la ruta al archivo de caché.
<?php
function isTorUser($ip)
{
$list = getTorExitList();
if (arrayBinarySearch($ip, $list) !== false) {
return true;
} else {
return false;
}
}
function getTorExitList()
{
$path = __DIR__ . ''/tor-list.cache'';
if ( file_exists($path) && time() - filemtime($path) < 600 ) {
$list = include $path;
if ($list && is_array($list)) {
return $list;
}
}
$data = file(''https://openinternet.io/tor/tor-node-list.txt'');
if (!$data) {
return array();
}
$list = array();
foreach($data as $line) {
$line = trim($line);
if ($line == '''' || $line[0] == ''#'') continue;
list($nick, $ip) = explode("/t", $line);
$list[] = $ip;
}
sort($list);
file_put_contents($path, sprintf("<?php return %s;", var_export($list, true)));
return $list;
}
/**
* Perform binary search of a sorted array.
* Credit: http://php.net/manual/en/function.array-search.php#39115
*
* Tested by VigilanTor for accuracy and efficiency
*
* @param string $needle String to search for
* @param array $haystack Array to search within
* @return boolean|number false if not found, or index if found
*/
function arrayBinarySearch($needle, $haystack)
{
$high = count($haystack);
$low = 0;
while ($high - $low > 1){
$probe = ($high + $low) / 2;
if ($haystack[$probe] < $needle){
$low = $probe;
} else{
$high = $probe;
}
}
if ($high == count($haystack) || $haystack[$high] != $needle) {
return false;
} else {
return $high;
}
}
Método n. ° 2 (Comprobación de IP contra el proyecto de lista de salida de Tor DNS):
La verificación de salida de DNS es un poco más sólida ya que tiene en cuenta la política de salida del relevo y observa qué IP y puerto en su servidor se está conectando el cliente y si se permite dicho tráfico de salida, devolverá una coincidencia. La posible caída es que si el proyecto de DNS está inactivo temporalmente, las solicitudes de DNS pueden bloquearse antes de que el tiempo disminuya.
Para este ejemplo, TorUtils una clase de una biblioteca que escribí y TorUtils llamada TorUtils .
En primer lugar, deberá instalarlo con Composer utilizando el composer require dapphp/torutils
e incluir el código estándar de vendor/autoloader.php
en su aplicación.
El código para el cheque: $ isTor = false;
try {
// check for Tor using the remote (client IP), server IP, and server Port (e.g. 80, 443).
$isTor = TorDNSEL::IpPort(
$_SERVER[''SERVER_ADDR''],
$_SERVER[''SERVER_PORT''],
$_SERVER[''REMOTE_ADDR'']
);
} catch (/Exception $ex) {
// This would likely be a timeout, or possibly a malformed DNS response
//echo $ex->getMessage() . "/n";
}
if ($isTor) {
// blocking action
}
consideraciones adicionales
Si su aplicación usa sesiones de PHP, sugiero encapsular la respuesta "isTorUser" en la sesión (junto con la IP de origen) y solo ejecutar la verificación inicialmente o cuando la IP cambie (por ejemplo $_SERVER[''REMOTE_ADDR''] != $_SESSION[''last_remote_addr'']
) para no realizar muchas búsquedas duplicadas. A pesar de que tratan de ser muy eficientes, es un desperdicio hacerlo una y otra vez por la misma IP.
¿Sería posible bloquear a los usuarios de Tor? ( https://www.torproject.org/ )
Debido a la naturaleza del sitio que ejecuto, debería hacer todo lo posible para detener varias cuentas y bloquear ciertas ubicaciones. Tor es peor que proxies, una pesadilla total ...
Bloquear Tor es incorrecto porque (ab) los usuarios y las direcciones IP no son lo mismo. Al bloquear Tor, también bloqueará usuarios legítimos y nodos de salida Tor inofensivos y restringidos configurados con políticas de salida conservadoras.
Por ejemplo, si te preocupan los ataques a SSH (puerto 22), bloquear solo a Tor hará poco para aumentar la seguridad. Lo que realmente podría necesitar es una lista negra sincronizada dinámica como http://denyhosts.sourceforge.net/ que rastrean a los infractores sin tener en cuenta su afiliación con Tor.
Denyhosts bloqueará automáticamente los nodos de salida Tor que permiten a Tor acceder al puerto 22 sin negar el acceso innecesario a usuarios anónimos y operadores de nodos de salida Tor que nunca permiten que los delincuentes ataquen sus servicios SSH.
Detectar el tráfico Tor es bastante fácil. La principal forma de hacerlo es supervisar la lista de nodos de salida de Tor y comparar la IP con la lista.
Tuve la necesidad de hacer algo así recientemente y construí una pequeña gema Ruby para mantener la lista de nodos de salida actualizada y proporcionar una forma simple de detectar los nodos de salida. También escribí un pequeño archivo ejecutable que puede usar para detectar los nodos de salida.
La gema es de código abierto y se puede encontrar aquí: tor-guard
Instalar la gema es bastante simple:
$ gem install tor-guard
El uso de la biblioteca en su propio código de Ruby se puede hacer de la siguiente manera:
require ''tor-guard''
if TorGuard.exit_node?(''108.56.199.13'')
puts "Yep, it''s an exit node!"
end
El ejecutable también es fácil de usar:
$ tg 108.56.199.13 && echo "Yep, it''s an exit node"
En .NET es posible y simple. Lo he implementado en mi sitio.
Digamos que su sitio tiene una dirección IP externa de 192.168.0.5 por razones de argumento. Dirección IP Real TOR en el momento de la publicación: 95.215.44.97
Imports System.Net
Imports System.Net.Sockets
Imports System.Web
Private Function IsTorExitNode(sIP As String) As Boolean
'' Reverse your IP (97.44.215.95) then pass to the string, I have just created it as one for this example
Try
Dim strTor As String = "97.44.215.95.80.5.0.168.192.ip-port.exitlist.torproject.org"
Dim host As IPHostEntry = Dns.GetHostEntry(strTor)
If host.AddressList.Length = 0 Then
Return False
Else
If host.AddressList(0).ToString() = "127.0.0.2" Then
Return True
Else
Return False
End If
End If
Catch ex As SocketException
Return False
End Try
End Function
Descompostura
Dirección IP revertida: 97.44.215.95
Puerto : 80
Dirección IP revertida : (la dirección IP de su sitio externo)
Si la dirección es un TorExitNode, devolverá 127.0.0.2.
En su archivo Global.asax, puede usar Application_Start para verificar si la dirección IP es verdadera y luego redirigirlos fuera de su sitio:
If IsTorExitNode("97.44.215.95") = True Then Response.Redirect("http://www.google.co.uk")
Ahora, tan pronto como llegan a su sitio, son redirigidos fuera de este.
TOR tiene una lista de https://check.torproject.org/exit-addresses , pero obviamente cambian todo el tiempo, por lo que usar mi función sería la mejor, ya que siempre es en tiempo real.
Encontré una lista de todos los nodos de Tor actualizados cada media hora: https://www.dan.me.uk/tornodes
Esto DEBERÍA incluir la salida, las entradas y los nodos del puente utilizados para conectarse y navegar a través de Tor.
Utilice este script de Perl para recopilar las direcciones IP de una página web descargada:
perl -lne ''print $& if /(/d+/.){3}/d+/'' downloadedwebpage.html > listofips.out
Le dará una lista de direcciones IP, una por línea. Intenté encontrar algo que hiciera esto sin el script de Perl, pero después de muchas horas buscando no pude encontrar uno.
Espero que esto ayude.
También encontré buena información aquí en el mismo sitio: https://www.dan.me.uk/dnsbl
Es posible debido a que el proyecto tor publica una lista de proxies de salida.
La lista de proxies de salida se puede descargar directamente del proyecto en https://check.torproject.org/exit-addresses en formato de texto delimitado por espacios.
He escrito una secuencia de comandos python para agregar reglas de iptables para todos los nodos de salida que rechazan todos los paquetes de ellos. Puede encontrar la secuencia de comandos en github aquí: https://github.com/vab/torblock
Si el Proyecto Tor alguna vez decide dejar de publicar una lista de nodos de salida, será posible bloquearlos. El código solo debe escribirse para conectarse a la red tor y descubrir los nodos de salida.
Es un hecho, que la mejor defensa de aplicaciones es su código y seguridad, no una lista de bloqueo de firewall. Si es una cuestión esencial para que usted tenga verdaderos usuarios reales, debe usar la autenticación de dos factores . Las listas de bloqueo son totalmente inútiles hoy en día.
Tor es mucho más fácil de bloquear que otros proxies abiertos ya que la lista de direcciones IP de salida es conocida y publicada. Lea la respuesta en https://www.torproject.org/docs/faq-abuse.html.en#Bans y, si aún desea bloquear el acceso de los usuarios a su sitio, puede usar https://www.torproject.org/projects/tordnsel.html.en o la herramienta de exportación Lista de salida masiva.
Si usa la herramienta de exportación de la Lista de salida masiva, asegúrese de obtener una lista nueva con frecuencia y caduque los bloques anteriores, ya que la lista de direcciones IP cambia.
El Proyecto Tor realmente proporciona su propia lista aquí:
Here (consulte Here ) se encuentra una API REST simple para determinar si una solicitud se realizó desde la red TOR o no.
La solicitud es: curl -X GET http://detor.ambar.cloud/
.
La respuesta es: { "sourceIp": "104.200.20.46", "destIp": "89.207.89.82", "destPort": "8080", "found": true }
Como bonificación, puede agregar una insignia a su sitio para detectar si un usuario proviene de TOR o no:
<img src="http://detor.ambar.cloud/badge" />
function isTorExitNode() {
$serverPort = $_SERVER[''SERVER_PORT''];
$remoteAddr = reverseIp(getClientIp());
$serverAddr = reverseIp($_SERVER[''SERVER_ADDR'']);
$placeholders = ''%s.%s.%s.ip-port.exitlist.torproject.org'';
$name = sprintf($placeholders, $remoteAddr, $serverPort, $serverAddr);
return ( gethostbyname($name) === ''127.0.0.2'' );
}
function getClientIp() {
if (isset($_SERVER[''HTTP_CF_CONNECTING_IP''])) {
return $_SERVER[''HTTP_CF_CONNECTING_IP''];
}
return $_SERVER[''REMOTE_ADDR''];
}
function reverseIp($ip) {
$ipParts = explode(''.'', $ip);
return $ipParts[3] . ''.'' . $ipParts[2] . ''.'' .
$ipParts[1] . ''.'' . $ipParts[0];
}
if(!isTorExitNode()) {
// Do nothing
} else {
Die("Sorry, You cannot use TOR network!!!");
}