sociales saber redes rastrear quien perfiles perfil mujeres identidades fotos falsos falso falsas desde creo como celular php curl spam-prevention

php - saber - perfiles falsos en facebook mujeres



Cómo detectar usuarios falsos(rastreadores) y cURL (6)

Como algunos han mencionado, cURL no puede ejecutar JavaScritp (que yo sepa) por lo que podría intentar establecer algo como lo sugiere Raina77ow, pero eso no lo haría para otros grabbers / donwloaders.

Te sugiero que intentes construir una trampa para bots de la misma manera que tratas con los grabbers / downloaders que pueden ejecutar JavaScript.

No conozco ninguna solución 1 para evitar esto por completo, por lo que mi mejor recomendación sería probar múltiples soluciones:

1) solo permite a los agentes de usuario conocidos, como todos los navegadores mainstream en su archivo .htaccess

2) Configure su robots.txt para evitar bots

3) Configurar una trampa de bot para bots que no respetan el archivo robots.txt

Algunos otros sitios web usan cURL y falsos http referer para copiar el contenido de mi sitio web. ¿Tenemos alguna forma de detectar cURL o no un navegador web real?


La forma de evitar referencias falsas es rastrear al usuario

Puede rastrear al usuario por uno o más de estos métodos:

  1. Guarde una cookie en el cliente del navegador con algún código especial (por ejemplo, la última URL visitada, una marca de tiempo) y verifíquelo en cada respuesta de su servidor.

  2. Igual que antes pero usando sesiones en lugar de cookies explícitas

Para las cookies, debe agregar seguridad criptográfica como.

[Cookie] url => http://someurl/ hash => dsafdshfdslajfd

hash se califica en PHP de esta manera

$url = $_COOKIE[''url'']; $hash = $_COOKIE[''hash'']; $secret = ''This is a fixed secret in the code of your application''; $isValidCookie = (hash(''algo'', $secret . $url) === $hash); $isValidReferer = $isValidCookie & ($_SERVER[''HTTP_REFERER''] === $url)


No hay una solución mágica para evitar el rastreo automático. Todo lo que un humano puede hacer, un robot puede hacerlo también. Solo hay soluciones para hacer el trabajo más difícil, tan difícil que solo los geeks fuertes y habilidosos pueden tratar de superarlos.

También estuve en problemas hace algunos años y mi primer consejo es, si tienes tiempo, ser tú mismo (supongo que un "rastreador" es el tipo que rastrea tu sitio web), esta es la mejor escuela para el tema. Al rastrear varios sitios web, aprendí diferentes tipos de protecciones, y al asociarlas he sido eficiente.

Te doy algunos ejemplos de protecciones que puedes probar.

Sesiones por IP

Si un usuario usa 50 sesiones nuevas cada minuto, puede pensar que este usuario podría ser un rastreador que no maneja las cookies. Por supuesto, curl administra las cookies perfectamente, pero si lo combina con un contador de visitas por sesión (explicado más adelante), o si su rastreador es un noobie con cuestiones de cookies, puede ser eficiente.

Es difícil imaginar que 50 personas de la misma conexión compartida obtendrán simultáneamente en su sitio web (por supuesto, depende de su tráfico, eso depende de usted). Y si esto sucede, puede bloquear las páginas de su sitio web hasta que se complete un captcha.

Idea :

1) creas 2 tablas: 1 para guardar ips prohibidos y 1 para guardar ip y sesiones

create table if not exists sessions_per_ip ( ip int unsigned, session_id varchar(32), creation timestamp default current_timestamp, primary key(ip, session_id) ); create table if not exists banned_ips ( ip int unsigned, creation timestamp default current_timestamp, primary key(ip) );

2) al comienzo de la secuencia de comandos, elimina las entradas demasiado antiguas de ambas tablas

3) a continuación, verifica si la IP de tu usuario está prohibida o no (estableces una bandera en verdadero)

4) si no, cuenta cuánto tiene sesiones para su ip

5) si tiene demasiadas sesiones, lo inserta en su tabla prohibida y establece una bandera

6) insertas su ip en las sesiones por tabla ip si aún no ha sido insertado

Escribí una muestra de código para mostrar de una mejor manera mi idea.

<?php try { // Some configuration (small values for demo) $max_sessions = 5; // 5 sessions/ip simultaneousely allowed $check_duration = 30; // 30 secs max lifetime of an ip on the sessions_per_ip table $lock_duration = 60; // time to lock your website for this ip if max_sessions is reached // Mysql connection require_once("config.php"); $dbh = new PDO("mysql:host={$host};dbname={$base}", $user, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Delete old entries in tables $query = "delete from sessions_per_ip where timestampdiff(second, creation, now()) > {$check_duration}"; $dbh->exec($query); $query = "delete from banned_ips where timestampdiff(second, creation, now()) > {$lock_duration}"; $dbh->exec($query); // Get useful info attached to our user... session_start(); $ip = ip2long($_SERVER[''REMOTE_ADDR'']); $session_id = session_id(); // Check if IP is already banned $banned = false; $count = $dbh->query("select count(*) from banned_ips where ip = ''{$ip}''")->fetchColumn(); if ($count > 0) { $banned = true; } else { // Count entries in our db for this ip $query = "select count(*) from sessions_per_ip where ip = ''{$ip}''"; $count = $dbh->query($query)->fetchColumn(); if ($count >= $max_sessions) { // Lock website for this ip $query = "insert ignore into banned_ips ( ip ) values ( ''{$ip}'' )"; $dbh->exec($query); $banned = true; } // Insert a new entry on our db if user''s session is not already recorded $query = "insert ignore into sessions_per_ip ( ip, session_id ) values (''{$ip}'', ''{$session_id}'')"; $dbh->exec($query); } // At this point you have a $banned if your user is banned or not. // The following code will allow us to test it... // We do not display anything now because we''ll play with sessions : // to make the demo more readable I prefer going step by step like // this. ob_start(); // Displays your current sessions echo "Your current sessions keys are : <br/>"; $query = "select session_id from sessions_per_ip where ip = ''{$ip}''"; foreach ($dbh->query($query) as $row) { echo "{$row[''session_id'']}<br/>"; } // Display and handle a way to create new sessions echo str_repeat(''<br/>'', 2); echo ''<a href="'' . basename(__FILE__) . ''?new=1">Create a new session / reload</a>''; if (isset($_GET[''new''])) { session_regenerate_id(); session_destroy(); header("Location: " . basename(__FILE__)); die(); } // Display if you''re banned or not echo str_repeat(''<br/>'', 2); if ($banned) { echo ''<span style="color:red;">You are banned: wait 60secs to be unbanned... a captcha must be more friendly of course!</span>''; echo ''<br/>''; echo ''<img src="http://4.bp.blogspot.com/-PezlYVgEEvg/TadW2e4OyHI/AAAAAAAAAAg/QHZPVQcBNeg/s1600/feu-rouge.png" />''; } else { echo ''<span style="color:blue;">You are not banned!</span>''; echo ''<br/>''; echo ''<img src="http://identityspecialist.files.wordpress.com/2010/06/traffic_light_green.png" />''; } ob_end_flush(); } catch (PDOException $e) { /*echo*/ $e->getMessage(); } ?>

Visitar mostrador

Si su usuario usa la misma cookie para rastrear sus páginas, podrá usar su sesión para bloquearla. Esta idea es bastante simple: ¿es posible que su usuario visite 60 páginas en 60 segundos?

Idea :

  1. Cree una matriz en la sesión del usuario, que contendrá el tiempo de visita () s.
  2. Eliminar las visitas anteriores a X segundos en este conjunto
  3. Agregue una nueva entrada para la visita real
  4. Contar las entradas en esta matriz
  5. Prohibir a su usuario si visitó páginas Y

Código de muestra :

<?php $visit_counter_pages = 5; // maximum number of pages to load $visit_counter_secs = 10; // maximum amount of time before cleaning visits session_start(); // initialize an array for our visit counter if (array_key_exists(''visit_counter'', $_SESSION) == false) { $_SESSION[''visit_counter''] = array(); } // clean old visits foreach ($_SESSION[''visit_counter''] as $key => $time) { if ((time() - $time) > $visit_counter_secs) { unset($_SESSION[''visit_counter''][$key]); } } // we add the current visit into our array $_SESSION[''visit_counter''][] = time(); // check if user has reached limit of visited pages $banned = false; if (count($_SESSION[''visit_counter'']) > $visit_counter_pages) { // puts ip of our user on the same "banned table" as earlier... $banned = true; } // At this point you have a $banned if your user is banned or not. // The following code will allow us to test it... echo ''<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>''; // Display counter $count = count($_SESSION[''visit_counter'']); echo "You visited {$count} pages."; echo str_repeat(''<br/>'', 2); echo <<< EOT <a id="reload" href="#">Reload</a> <script type="text/javascript"> $(''#reload'').click(function(e) { e.preventDefault(); window.location.reload(); }); </script> EOT; echo str_repeat(''<br/>'', 2); // Display if you''re banned or not echo str_repeat(''<br/>'', 2); if ($banned) { echo ''<span style="color:red;">You are banned! Wait for a short while (10 secs in this demo)...</span>''; echo ''<br/>''; echo ''<img src="http://4.bp.blogspot.com/-PezlYVgEEvg/TadW2e4OyHI/AAAAAAAAAAg/QHZPVQcBNeg/s1600/feu-rouge.png" />''; } else { echo ''<span style="color:blue;">You are not banned!</span>''; echo ''<br/>''; echo ''<img src="http://identityspecialist.files.wordpress.com/2010/06/traffic_light_green.png" />''; } ?>

Una imagen para descargar

Cuando un rastreador necesita hacer su trabajo sucio, eso es para una gran cantidad de datos, y en el menor tiempo posible. Es por eso que no descargan imágenes en las páginas; toma demasiado ancho de banda y hace que el arrastre sea más lento.

Esta idea (creo que es la más fácil y la más fácil de implementar) usa mod_rewrite para ocultar código en un archivo .jpg / .png / ... de imagen. Esta imagen debe estar disponible en cada página que desee proteger: podría ser su sitio web de logotipo, pero elegirá una imagen de tamaño pequeño (porque esta imagen no debe almacenarse en caché).

Idea :

1 / Agregue esas líneas a su .htaccess

RewriteEngine On RewriteBase /tests/anticrawl/ RewriteRule ^logo/.jpg$ logo.php

2 / Crea tu logo.php con la seguridad

<?php // start session and reset counter session_start(); $_SESSION[''no_logo_count''] = 0; // forces image to reload next time header("Cache-Control: no-store, no-cache, must-revalidate"); // displays image header("Content-type: image/jpg"); readfile("logo.jpg"); die();

3 / Incremente su no_logo_count en cada página que necesite para agregar seguridad, y verifique si alcanzó su límite.

Código de muestra :

<?php $no_logo_limit = 5; // number of allowd pages without logo // start session and initialize session_start(); if (array_key_exists(''no_logo_count'', $_SESSION) == false) { $_SESSION[''no_logo_count''] = 0; } else { $_SESSION[''no_logo_count'']++; } // check if user has reached limit of "undownloaded image" $banned = false; if ($_SESSION[''no_logo_count''] >= $no_logo_limit) { // puts ip of our user on the same "banned table" as earlier... $banned = true; } // At this point you have a $banned if your user is banned or not. // The following code will allow us to test it... echo ''<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>''; // Display counter echo "You did not loaded image {$_SESSION[''no_logo_count'']} times."; echo str_repeat(''<br/>'', 2); // Display "reload" link echo <<< EOT <a id="reload" href="#">Reload</a> <script type="text/javascript"> $(''#reload'').click(function(e) { e.preventDefault(); window.location.reload(); }); </script> EOT; echo str_repeat(''<br/>'', 2); // Display "show image" link : note that we''re using .jpg file echo <<< EOT <div id="image_container"> <a id="image_load" href="#">Load image</a> </div> <br/> <script type="text/javascript"> // On your implementation, you''llO of course use <img src="logo.jpg" /> $(''#image_load'').click(function(e) { e.preventDefault(); $(''#image_load'').html(''<img src="logo.jpg" />''); }); </script> EOT; // Display if you''re banned or not echo str_repeat(''<br/>'', 2); if ($banned) { echo ''<span style="color:red;">You are banned: click on "load image" and reload...</span>''; echo ''<br/>''; echo ''<img src="http://4.bp.blogspot.com/-PezlYVgEEvg/TadW2e4OyHI/AAAAAAAAAAg/QHZPVQcBNeg/s1600/feu-rouge.png" />''; } else { echo ''<span style="color:blue;">You are not banned!</span>''; echo ''<br/>''; echo ''<img src="http://identityspecialist.files.wordpress.com/2010/06/traffic_light_green.png" />''; } ?>

Verificación de cookies

Puede crear cookies en javascript para verificar si sus usuarios interpretan javascript (un rastreador que usa Curl no lo hace, por ejemplo).

La idea es bastante simple: esto es casi lo mismo que una verificación de imagen.

  1. Establezca un valor de $ _SESSION en 1 e increméntelo en cada visita
  2. si existe una cookie (establecida en JavaScript), establezca el valor de la sesión en 0
  3. si este valor alcanza un límite, prohibir a su usuario

Código:

<?php $no_cookie_limit = 5; // number of allowd pages without cookie set check // Start session and reset counter session_start(); if (array_key_exists(''cookie_check_count'', $_SESSION) == false) { $_SESSION[''cookie_check_count''] = 0; } // Initializes cookie (note: rename it to a more discrete name of course) or check cookie value if ((array_key_exists(''cookie_check'', $_COOKIE) == false) || ($_COOKIE[''cookie_check''] != 42)) { // Cookie does not exist or is incorrect... $_SESSION[''cookie_check_count'']++; } else { // Cookie is properly set so we reset counter $_SESSION[''cookie_check_count''] = 0; } // Check if user has reached limit of "cookie check" $banned = false; if ($_SESSION[''cookie_check_count''] >= $no_cookie_limit) { // puts ip of our user on the same "banned table" as earlier... $banned = true; } // At this point you have a $banned if your user is banned or not. // The following code will allow us to test it... echo ''<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>''; // Display counter echo "Cookie check failed {$_SESSION[''cookie_check_count'']} times."; echo str_repeat(''<br/>'', 2); // Display "reload" link echo <<< EOT <br/> <a id="reload" href="#">Reload</a> <br/> <script type="text/javascript"> $(''#reload'').click(function(e) { e.preventDefault(); window.location.reload(); }); </script> EOT; // Display "set cookie" link echo <<< EOT <br/> <a id="cookie_link" href="#">Set cookie</a> <br/> <script type="text/javascript"> // On your implementation, you''ll of course put the cookie set on a $(document).ready() $(''#cookie_link'').click(function(e) { e.preventDefault(); var expires = new Date(); expires.setTime(new Date().getTime() + 3600000); document.cookie="cookie_check=42;expires=" + expires.toGMTString(); }); </script> EOT; // Display "unset cookie" link echo <<< EOT <br/> <a id="unset_cookie" href="#">Unset cookie</a> <br/> <script type="text/javascript"> // On your implementation, you''ll of course put the cookie set on a $(document).ready() $(''#unset_cookie'').click(function(e) { e.preventDefault(); document.cookie="cookie_check=;expires=Thu, 01 Jan 1970 00:00:01 GMT"; }); </script> EOT; // Display if you''re banned or not echo str_repeat(''<br/>'', 2); if ($banned) { echo ''<span style="color:red;">You are banned: click on "Set cookie" and reload...</span>''; echo ''<br/>''; echo ''<img src="http://4.bp.blogspot.com/-PezlYVgEEvg/TadW2e4OyHI/AAAAAAAAAAg/QHZPVQcBNeg/s1600/feu-rouge.png" />''; } else { echo ''<span style="color:blue;">You are not banned!</span>''; echo ''<br/>''; echo ''<img src="http://identityspecialist.files.wordpress.com/2010/06/traffic_light_green.png" />''; }

Protección contra proxies

Algunas palabras sobre los diferentes tipos de proxies que podemos encontrar en la web:

  • Un proxy "normal" muestra información sobre la conexión del usuario (en particular, su IP)
  • Un proxy anónimo no muestra IP, pero proporciona información sobre el uso del proxy en el encabezado.
  • Un proxy anónimo alto no muestra la IP del usuario y no muestra ninguna información que un navegador no pueda enviar.

Es fácil encontrar un proxy para conectar cualquier sitio web, pero es muy difícil encontrar servidores proxy anónimos.

Algunas variables $ _SERVER pueden contener claves específicamente si sus usuarios están detrás de un proxy (la lista exhaustiva tomó de esta pregunta ):

  • CLIENT_IP
  • REMITIDO
  • FORWARDED_FOR
  • FORWARDED_FOR_IP
  • HTTP_CLIENT_IP
  • HTTP_FORWARDED
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED_FOR_IP
  • HTTP_PC_REMOTE_ADDR
  • HTTP_PROXY_CONNECTION ''
  • HTTP_VIA
  • HTTP_X_FORWARDED
  • HTTP_X_FORWARDED_FOR
  • HTTP_X_FORWARDED_FOR_IP
  • HTTP_X_IMFORWARDS
  • HTTP_XROXY_CONNECTION
  • VÍA
  • X_FORWARDED
  • X_FORWARDED_FOR

Puede otorgar un comportamiento diferente (límites inferiores, etc.) a sus valores antirrastre si detecta una de esas claves en su variable $_SERVER .

Conclusión

Hay muchas maneras de detectar abusos en su sitio web, por lo que encontrará una solución segura. Pero necesita saber exactamente cómo se usa su sitio web, por lo que sus valores no serán agresivos con sus usuarios "normales".


Puedes detectar cURL-Useragent por el siguiente método. Pero ten en cuenta que el usertragent podría ser sobreescrito por el usuario, de todos modos la configuración predeterminada podría ser reconocida por:

function is_curl() { if (stristr($_SERVER["HTTP_USER_AGENT"], ''curl'')) return true; }


Recuerde: HTTP no es magia. Hay un conjunto definido de encabezados enviados con cada solicitud HTTP; si estos encabezados son enviados por un navegador web, también pueden ser enviados por cualquier programa, incluidos cURL (y libcurl).

Algunos lo consideran una maldición, pero por otro lado, es una bendición, ya que simplifica enormemente las pruebas funcionales de las aplicaciones web.

ACTUALIZACIÓN: como unr3al011 correctamente notado, curl no ejecuta JavaScript, por lo que en teoría es posible crear una página que se comporte de manera diferente cuando sea vista por los capturadores (por ejemplo, con la configuración y, luego, verificando una cookie específica por medio de JS).

Aún así, sería una defensa muy frágil. Los datos de la página todavía tenían que ser tomados del servidor, y esta solicitud HTTP (y siempre es una solicitud HTTP) puede emularse mediante curl. Vea esta respuesta, por ejemplo, sobre cómo vencer esa defensa.

... y ni siquiera mencioné que algunos grabbers pueden ejecutar JavaScript. )


poner esto en la carpeta raíz como archivo .htaccess . puede ayudar. Lo encontré en un sitio de proveedor de alojamiento web pero no sé lo que eso significa :)

SetEnvIf User-Agent ^Teleport graber SetEnvIf User-Agent ^w3m graber SetEnvIf User-Agent ^Offline graber SetEnvIf User-Agent Downloader graber SetEnvIf User-Agent snake graber SetEnvIf User-Agent Xenu graber Deny from env=graber