les cuento mi problema, tengo un Servidor dedicado en CENTos
en el cual, solo tengo una cuenta (creada con WHM)
dentro de esa cuenta, tengo un sitio web muy visitado, que esta hecho en FLASH
(y es programado por php)
desde hace unos dias, un usuario esta atacando un mensajero, el cual se conecta a
insertar.php y recibe 2 parametros del flash
Nombre
Mensaje
insertar.php se encarga de procesar dichas variables, para que no contengan inyeccion SQL.
bueno, ese no es el problema. el problema es que me estan insertando SPAM (una gran cantidad de mensajes insertados por segundo)
Supuse que un usuario descompilo el flash, supo los valores que se enviaban a insertar.php y realizo una aplicacion la cual enviaba esos 2 valores al php.
como los campos solo contenian nombres y mensajes aleatorios(mas no dañinos) el insert.php los insertaba.
entonces.. intente capturar la IP del usuario
[URL="www.eslomas.com/index.php/archives/2005/04/26/obtencion-ip-real-php/"](obtener ip real)[/URL]
e insert.php hacia una consulta, si el ultimo mensaje provenia de dicha IP, simplemente no insertaba.
el usuario se detuvo por unas 3 horas, y pense que el problema estaba solucionado
al cabo de dicho tiempo se empezo a llenar de SPAM la base de datos, vi la tabla y las ips empezaron a cambiar ''drasticamente'' entonces la consulta a la base de datos era "nula"
entonces, pense en verificar el navegador del usuario.
($_SERVER['HTTP_USER_AGENT'] e insertarlo en BD.
supe que el usuario mamon utilizaba java
entonces insert.php solo insertaba mensajes provenientes de IE,Firefox,Safari,Chrome.
igual, el problema se detuvo unas 2 horas.
(supe que el problema ya estaba solucionado)
FUCK!
se volvio a llenar de SPAM mi base de datos
cheque rapidamente de que navegador provenian los mensajes, y decia "Firefox"!!
obviamente el usuario cambio la referencia USER_AGENT
(supe que si se podia, pero jamas pense que se imaginara que lo estaba deteniendo por eso)
(cabe aclarar que a mi no me gustan los CAPTCHAS, se me hacen molestos para los usuarios)
pero en este punto sabia que tenia que empezar a utilizar uno, antes de ello quise probar unas cosas mas.
pense en un "captcha invisible" (cabe aclarar que uso 100% flash)
lo que hice, fue esconder un Movieclip vacio, y dentro de el, hacer un "load" cada 5 segundos (con direccion absoluta para no mostrar errores al probar)
el load era a un archivo que estaba fuera de la carpeta del insert.php
y con un nombre muy diferente (en este post lo llamare invisible.php)
invisible.php contiene:
Código PHP:
<?php
session_start();
$c=md5(rand());
$_SESSION['codigo']=$c;
echo"codigo=$c";
//ya se que es estupido mostrar el codigo, pero si se trata de
//un captcha invisible, el flash lo tiene que saber (no el usuario(aparentemente))
el valor global lo llamare en este post codigo_global
okey, entonces, ahora mi flash mandaba 3 parametros:
nombre
mensaje
codigo_global
insert.php hacia la comparacion
Código PHP:
<?php
if(!isset($_SESSION['codigo'])) exit();
//si no se a cargado la session (por medio de[B]invisible.php[/B]) entonces exit;
if(!isset($_POST['codigo_global'])) exit();
//si no hay valor en codigo_global (POST) obviamente el valor tiene que ser si visito el flash
//(ó invisible.php)
if($_POST['codigo_global'] !== $_SESSION['codigo']) exit();
//si existen los valores, pero no son iguales, sacalo!
//aclaro que los valores ya van formateados para evitar las inyecciones, pero asi lo puse para
//ahorrar codigo
deje de recibir SPAM un dia, entonces pense que era una solucion ''rapida, pero no efectiva''
ya que si descubria invisible.php estaba perdido(practicamente)
asi fue, al dia siguiente SPAM SPAM SPAM
**o dios mio!! **
entonces, dije, bueno, ahora probare otro metodo
me dispuse a crear unas lineas.
teoria:
si es la primera vez que manda mensaje, crear sesion (contador) con valor 1
si vuelve a mandar mensaje, sumar contador a 2
si vuelve a mandar mensaje, sumar contador a 3
si vuelve a mandar mensaje, sumar contador a 4
...
si contador llega a 10, EXIT
(valor de contador se guardara en la BD)
teoricamente si funcionaba, de varias PC envie mensajes
y si iban seguidos (o como sea)
el contador si funcionaba, al llegar a 10 EXIT definitivo hasta cerrar navegador.
...
...
..
SPAM SPAM SPAM!!
ASH!
porque contador(sesion) no sumaba y permanecia siempre en 0 de mensaje en mensaje????????
aclaro, mi PC (y mi red local en gral) tiene antivirus actualizado, firewall al puro tiro.
asi que no creo que me hayan plantado algo en mi pc
la pregunta es...
se pueden burlar las sessiones???
a pesar de que tengo un sleep(4) antes de insertar, porque los mensajes se insertan
en menos de 1 segundo??? (campo fecha/hora/segundo me dice eso)
cuando borro insert.php automaticamente se deja de recibir spam, asi que no creo que haya otro archivo que los introduzca.