2011-03-04 10 views
5

Buen día,¿Cómo me protejo contra ajax-spam en PHP?

Me gustaría saber cómo proteger mi sitio web de ajax-spam. Estoy buscando limitar cualquier acción de Ajax por usuarios de . Digamos 8 ajax-acciones por minuto.

Un ejemplo de una acción sería: un botón para agregar/eliminar una publicación de blog "como mis favoritos".

A menos que esté equivocado, creo que la mejor manera sería usar la variable $_SESSION y evitar que alguien/un bot elimine las cookies para evitar mi protección. Estoy permitiendo ajax-functions solo para los usuarios que han iniciado sesión.

El uso de la base de datos haría que mi protección fuera inútil porque son las escrituras de la base de datos no deseadas las que trato de evitar.

tengo que mencionar que en realidad yo uso PHP como de lenguaje de servidor y jQuery procede a mis llamadas ajax.

Gracias

Editar:

El sentense

... para proteger a mi sitio web ...

es confuso, pero no se trata de cruzada dominio ajax.

Editar 2011-04-20: Añadí una recompensa de 50 a él.

+0

¿Por qué no sigo cambiando la fecha para recibir más llamadas? Además, las cookies no funcionan contra la mayoría/todos los bots. Puedo usar el curl de PHP para evitar su limitación fácilmente si lo entiendo correctamente. –

+0

Básicamente, limita las acciones, 8 por minuto, luego rechaza todas las acciones. Esto podría funcionar, incluso si no estoy seguro de que limitar a tus usuarios a las llamadas ajax es lo mejor que puedes hacer :) A nadie le gusta estar limitado en tiempo o número cuando usas un sitio web. De eso no estoy seguro. – Tsadiq

+0

@Kevin, I duda puede cambiar la fecha usted mismo: es una variable de sesión. Además, incluso con cURL, debe enviar el buen sessionid que coincida con un usuario conectado para que pueda continuar con cualquier acción. – Cybrix

Respuesta

9

Dado que solo está permitiendo acciones de AJAX para los usuarios que inician sesión, esto es realmente simple de resolver.

  • Crea un campo de marca de tiempo para cada cuenta. Puede hacer esto en la base de datos, o aprovechar Memcached, o alternativamente usar un archivo plano.
  • Cada vez que el usuario hace una petición a través de su interfaz AJAX, agregar la fecha y hora actual a sus registros, y:
  • Compruebe para asegurarse de que los últimos ocho marcas de tiempo no son hace todo antes de un minuto.

Desde allí puede agregar magia adicional, como cuentas tempranas que violan flagrantemente el límite de velocidad, o comparar las direcciones IP de los infractores con las listas negras de spammers conocidos, etcétera.

+0

+1 buena solución. Esperemos un poco para ver las otras soluciones, pero dudo que sea muy diferente. – Cybrix

+0

@ Cybrix, seguro. Como una adición, si encuentra que recibe muchas solicitudes difamatorias de AJAX que están siendo atrapadas por el modelo de cuenta limitada, sería rentable asegurarse de que ninguna de las lógicas de verificación de inicio de sesión involucre consultas complejas de bases de datos, como se une o más de un par de consultas en general. Exponer demasiada información de la base de datos a un proceso fácil de realizar, como la comprobación de la sesión, lo hace vulnerable a un ataque DDoS. –

0

Sí, su idea en principio es buena. Algunas cosas a tener en cuenta sin embargo:

  • Si realiza el seguimiento de los límites a nivel mundial entonces es posible que encuentre la emisión de un bot DoS ing su servidor y evitando que los usuarios legítimos de ser capaz de utilizar el botón "favorito".
  • Si realiza un seguimiento de las solicitudes en función de su IP, entonces alguien podría usar una red de bot (IP múltiples) para evitar su bloqueo. Dependiendo de su sitio y cuál es su preferencia, quizás límite basado en un subnet of the IP.
  • Instale y use Memcache para almacenar y rastrear las solicitudes, especialmente si va a realizar un seguimiento basado en la IP. Esto debería ser más rápido que usar variables de sesión (alguien podría corregirme en esto).
+0

P: ¿Cuáles son los beneficios de Memcache sobre APC para algo como esto?(si corresponde) –

+0

No conozco los detalles, pero sugería Memcache solo para almacenar los valores en memoria, en lugar de escribirlos en los archivos de sesión. AFAIK APC hace algo similar, entonces usa cualquiera de los dos. –

+0

Creo que la manera más eficiente de limitar el ajax es por usuario, no por funciones. – Cybrix

1

¿Estás hablando específicamente de ajax-spam en tu sitio, o ajax-spam en general?

En este último caso, puede utilizar hash para evitar el envío automático de formularios, es decir, escribir su hash() función de una sola dirección que toma una cadena y hace una suma de comprobación sha1 de la misma.

Así que esa es la forma en que lo utilice:

 
// the page is a blog post #357 
$id = 357; 
$type = 'post'; 
$hash = hash($_SERVER['REMOTE_ADDR'].$type.$id); 

poner eso de hash en campo oculto que es no dentro del formulario de comentarios o incluso div oculto, en algún lugar en la parte inferior de la página, y el nombre " control_hash "o algo. Adjunte su valor a la solicitud de ajax en el envío del formulario. Cuando el script recibe el formulario, cree un nuevo hash a partir del $_REQUEST de datos (excluyendo el existente $control_hash) y verifique si coinciden.

Si el formulario fue enviado por bot, no tendrá $control_hash, por lo que no pasará.

+0

>> * Si el formulario fue enviado por bot, no tendrá $ control_hash, por lo que no pasará. * Esto supone que el bot es genérico y no está adaptado al sitio específico. Esta no es una suposición segura de hacer. –

+1

@Kerin "Cuando lo asumes, nos haces el culo a ti y a mí" –

+0

... Sí, eso es más o menos lo que dije. Además, no tengo idea de cómo deshacer tu comentario, fue un accidente. –

0

Si tiene acceso al código fuente del sitio web, puede volver a escribir algunos de los códigos JavaScript que realmente realizan la solicitud AJAX. Es decir. sus páginas pueden tener un campo de contador oculto, que se incrementa cada vez que un usuario hace clic en el botón. Y también puede tener un campo de tiempo oculto en la página, para poder calificar la frecuencia de los clics.

La idea es que ni siquiera tenga que enviar nada al servidor en absoluto, simplemente verifique en el lado del cliente dentro del script. Por supuesto, eso no ayudará contra los bots que dirigen directamente al servidor.

0

Realmente depende del resultado de dicho correo no deseado. Si solo quiere evitar escribir en su base de datos, todos estos controles podrían terminar tomando más recursos que escribir en la base de datos.

¿El final justifica los medios?

También tiene que juzgar cuál es la probabilidad de dicho spam. La mayoría de los bots no son muy inteligentes y fracasarán miserablemente cuando haya algún registro involucrado.

Solo mis 2 centavos, las otras respuestas son perfectamente válidas para evitar el correo no deseado.

0

Compre un hosting más potente para poder atender solicitudes, no las limite. 8 solicitudes por minuto es ridículo.
De todos modos, si las solicitudes son 'legales', debe encontrar formas de atender solicitudes, no cómo limitarlas. Y si no es 'legal', entonces niegalos sin limitaciones de "tiempo".

0

Puede usar un campo de sesión con una variable global que contiene la hora de la última solicitud de ajax. Como desea permitir 8 solicitudes, haga una matriz de tamaño 8 y verifique las diferencias de tiempo. Si aumenta, (importante) podría no ser siempre un bot. dale al usuario una oportunidad con captcha o algo similar.(Un problema de matemáticas, tal vez?)

una vez que el código de imagen es validado, permitir que los próximos mensajes, etc ..

pero asegúrese de que usted está mirando para esa sesión y usuario en particular.

La respuesta de Kerin es buena, solo quería enfatizar en captcha.

0

sí, necesita usar una función en cada función, las vistas pueden interactuar, también, debe estar en la biblioteca global para que pueda usarlo en cualquier lugar.

if(is_logged_in()) 
{ 
    // do you code here 
} 

mientras que en is_logged se define como sigue

function is_logged_in($activated = TRUE) 
{ 
    return $this->ci->session->userdata('status') === ($activated ? STATUS_ACTIVATED : STATUS_NOT_ACTIVATED); 
} 

debe establecer la sesión de estado cuando el usuario de inicio de sesión con éxito.

+0

¿cómo ayudará a proteger contra el correo basura? como el usuario puede iniciar sesión y luego pasar la cookie al script de spam –

Cuestiones relacionadas