2011-05-12 17 views
7

según lo propuesto por Stopping Bot [SO] - PHP he desarrollado un sistema anti-bot en PHP que codifican puede ser visto en https://codereview.stackexchange.com/questions/2362/anti-bot-comment-system-phpde respuesta cuando así lo solicite el código original - PHP

Pero nadie puede obtener una muestra mediante la visualización de getToken.php
En Así que obtienen el token de stackauth.com [lo creo al ver el código de la página], pero cuando lo busqué, ¡solo mostró un texto!
¿Cómo puedo hacer algo como eso? [Contadores a ser aprobado únicamente cuando lo solicite el código, no por el navegador]

el proceso de generación y verificación de contador
en la página de formulario

$hash=sha1($time.$myKey); 
echo $time.'#'.$hash; 

En la página de cartel/verificación

$token=explode($_POST['token'],'#',2); 
if (sha1($token[0].$myKey)==$token[1]) 
echo 'A good Human'; 

Edit
No almaceno el token usado en la base de datos, y un token expira después de [digamos] ¡5 minutos!
piensa que un mal usuario recibe el token 2011-05-18 11: 10: 12 # AhAShKey000000000 puede utilizar el token de presentar el texto al azar a 2011-05-18 11:15:12, ¿cómo se puede arreglar i este problema ?

+0

Antes de poner o cerrar la votación por favor explique la razón! – Sourav

+0

No puedo usar CAPTCHA, ya que esto forzará al usuario a odiar el sitio. – Sourav

+0

Verificar HTTP_REFERER o tal opción no es una respuesta porque pueden cambiarse fácilmente. – Sourav

Respuesta

0

Después de leer toda la respuesta cuidadosamente he desarrollado esta [Gracias a todas las personas por sus valiosos comentarios y respuesta]

<?php 
$time = microtime(); 
for ($i=1;$i<=10000;$i++) 
generateMath(); 

echo 'Generating '.$i.' math Took '.(microtime()-$time); 

function generateMath() 
{ 
$operands = array(43,45,42); 
$val = chr(rand(48,57)); 
$ope = chr($operands[rand(0,2)]); 
$txt = $val.$ope; //42* 43+ 45- 47/ 
$val2 = chr(rand(48,57)); 
$txt .= $val2; 
$ans = 0; 
if ($ope == '+') 
    $ans = $val + $val2; 
else if ($ope == '-') 
    $ans = $val - $val2; 
else if ($ope == '*') 
    $ans = $val * $val2; 
echo $txt.' -> '.$ans.'<br/>'; 
} 
?> 

Esto se puede mejorar mediante la adición de números aleatorios de los espacios en $txt = $val.$spaces.$ope.$spaces.$val2;

Y fue más rápido que CAPCHA, la gente tendrá que hacer una matemática realmente simple si publica más de 30 o más comentarios en una hora.

+0

evité la división ya que genera en algún momento división por cero – Sourav

3

No totalmente seguro de que esta es la respuesta que está buscando, pero ...

Cargar el token de forma estática en la página, en lugar de con el Ajax. Entonces sabrá que la página del formulario se cargó con seguridad.

+0

También estaba pensando en eso, pero el problema es ** cualquiera puede crear un bot que descargue un formulario y luego extraer el token [haciendo una búsqueda simple] y usarlo para enviar spam/datos, cómo detener eso ? ** – Sourav

+2

Bueno, un humano también podría enviar correo no deseado (de forma manual). Si desea evitar el correo no deseado automático, use un captcha o una [alternativa] (http://www.google.com/search?q=captcha + alternativa). – Jonah

1

Eso no detendrá nada, de hecho, solo añadirá más tensión a su servidor.

Use hashcash en su lugar (Wordpress plugin).

0

Bueno, esto es un poco imposible de arreglar. No puede ver si un bot o un navegador está viendo su "página de token". Todas las cosas que podrías verificar también son posibles de imitar. (Referidos, más hashes o user-agents)

Debe preguntarse, ¿de qué desea proteger su sitio? Para un robot normal, sus métodos están bien, tomará demasiado tiempo para descifrar su secuencia de comandos y correo basura solo en su sitio. Seguirá y enviará spam a otra persona. Entonces, en ese elenco, tu script dará suficiente protección.

Cuando hay alguien apuntando solo a su sitio y se toma el tiempo para descifrarlo, probablemente lo logre. ¿Entonces también quieres mantener fuera a este tipo de bots/gente? Sugeriría mostrar un captcha después de, por ejemplo, 3 publicaciones dentro de una hora desde una dirección IP. Eso los mantendrá afuera.

No siempre se trata de ser completamente seguro, su solución ya podría ser lo suficientemente buena ... Si se requiere más protección, solo use captchas o algo así.

1

Nada va a detener por completo este tipo de actividad. Sin embargo, para el caso 99.99999999999%, un método que usa un componente del lado del servidor más algo que usa javascript para realizar una transformación en los datos que obtiene del servidor detendrá la mayoría de los bots que están por ahí (a menos están basados ​​en node.js y están usando jsdom ;-)).

0

Está bien, como todo lo demás, no es completamente seguro.

Puede intentar crear un hash similar con javascript que incluya la hora y una ID única del usuario y enviarla con la solicitud. Incluso puede agregar eso a la generación y verificación del código. En ausencia de este hash, no se sirve ningún código.

Más o menos como un apretón de manos.

2

Puede usar ftok(__FILE__,'T'); - y el token será único en cada sistema.
En lugar de T puede usar cualquier letra, lea Manual.

Como ejemplo, en su getToken.php puede reemplazar:
$hash=sha1($key.'mySecretKey');
con
$hash=sha1($key.ftok(__FILE__,'T'));

Esta función existe solo en sistemas basados ​​en Linux/Unix.

+0

se apreciará un ejemplo con un pequeño bloque de código – Sourav

+0

@Sourav, editado. –

Cuestiones relacionadas