Foros del Web » Programando para Internet » PHP »

Seguridad en formularios

Estas en el tema de Seguridad en formularios en el foro de PHP en Foros del Web. Hola amigos, he estado haciendo un registro de usuarios, pero siempre un usuario malicioso me ingresa miles de registros y eos hace que aparezca en ...
  #1 (permalink)  
Antiguo 03/02/2006, 22:48
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 14 años
Puntos: 0
Seguridad en formularios

Hola amigos, he estado haciendo un registro de usuarios, pero siempre un usuario malicioso me ingresa miles de registros y eos hace que aparezca en la lista. Queria saber como prevenir eso??

He pensado en hacer que compruebe si se esta enviando desde el formulario para que lo permita, pero como lo podria hacer?? Aunque en verdad no se si sea lo correcto por que no se con que script aran esos registros automaticamente.

Gracias
  #2 (permalink)  
Antiguo 03/02/2006, 22:59
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 12 años, 4 meses
Puntos: 2
Particularmente para mis formularios de registro y demás como primordial implemento el típico campo de "ingrese el código que ve en la imágen". Ya con eso evitarias el ingreso repetitivo de datos por programas automáticos.

Por otro lado, y para evitar los ingresos manuales mal intencionados, opté por pedir unicamente en el formulario de registro un apodo, y un mail. Una vez que el usuario ingresa esos datos, le envío un correo a su casilla con un link que deberá presionar para activar su cuenta, y continuar con el proceso de registro donde se piden los demás datos necesarios. También el script valida que el mail que el usuario ingresa, no haya sido registrado por algún otro usuario anteriormente, con lo que logro que si X usuario tiene ganas de molestarme registrándose varias veces, al menos se tenga que hacer una cuenta de correo distinta para cada vez.

En fin, esos son mis métodos para proteger mis formularios, espero que te sean útiles.
Saludos.
__________________
R4DS en español | R4DS en inglés
  #3 (permalink)  
Antiguo 04/02/2006, 07:50
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
Información también podrías

También podrías almacenar su dirección IP en una base de datos junto con la hora en la que envió el formulario.

Así, tienes más eventos con los qué jugar, ejm:
  • Un usuario sólo puede enviar hasta 'n' formularios en 24 horas.
  • Un usuario no puede enviar el siguiente formulario hasta que hayan pasado al menos 'x' minutos.
  • Un usuario puede enviar un formulario pero a partir del segundo, un aviso le dirá que no será publicado hasta la previa revisión del webmaster (así, no limitas a tus buenos usuarios y sí fastidias a los malos usuarios).
  #4 (permalink)  
Antiguo 04/02/2006, 08:57
 
Fecha de Ingreso: agosto-2005
Mensajes: 28
Antigüedad: 12 años, 4 meses
Puntos: 0
Hola a todos amigos, yo incluso lo que haria es inutilizarle el acceso mediante la ip, como banearle, haciendo que registre su ip en una bd.

Asi cuando se conecte, si usa la misma ip le impedira el acceso a donde tu indiques.

Suerte!!!
__________________
:risa: En la vida hay que buscar soluciones, da todas la vueltas que haya que dar para conseguirlo, da igual que la solucion sea estupida, lo que importa es que funcione y sea segura :risa: [email protected]
  #5 (permalink)  
Antiguo 04/02/2006, 09:00
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 12 años, 2 meses
Puntos: 2
lo del ip no se?

lo del ip creo que no sirve ya pues en mi pais por lo menos y en varios mas, las empresas de internet no te asignan un ip unico sino que cada vez que reinicias la maquina la ip cambia

entonces al anular la ip estarias anulando a posibles futuros usuarios

saludos
__________________
DJJJ
  #6 (permalink)  
Antiguo 04/02/2006, 09:21
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
podrías quizá

Podrías quizá bannear la IP por 6 horas y no para siempre.

De esa forma si un usuario quiere fastidiarte, tendrá que conectarse de diversas computadoras o bien, conectarse y desconectarse varias veces, lo cuál no creo que le sea nada grato.

Alternativa 2
Esta se puede combinar con cualquiera que hayas ideado. Métele una cookie a la PC molestona. Cada vez que alguien que tiene tu special cookie quiera llenar un formulario, ya después de que lo haya llenado cargas la pantalla:

"Disculpe las molestias, estamos en reparación."
  #7 (permalink)  
Antiguo 04/02/2006, 09:24
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 12 años, 2 meses
Puntos: 2
ok buena idea no lo habia pensado



de paso haber si me ayudas,como puedo hacer
si tengo una lista de ip en un archivo de texto
y quiero que se borre cada 1 hora

o sea ip - tiempo de entrada


me ayudas???
__________________
DJJJ
  #8 (permalink)  
Antiguo 04/02/2006, 10:13
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
en texto está cañón...

Es una lata tratar con texto, no hay que liarse tanto.

En una simple tablita de tu base de datos puedes conseguirlo de una forma muy sencilla, pero tendría que conocer un poquito sobre cómo conectarte con la base de datos y manipular la información.

Te puedo dar una idea de cómo iría la onda.

Los campos de la tabla podrían ser:

Código:
-------- TABLA: IPS_BANEADAS -----------
campo: id, autonumérico.
campo: ip, la IP del usuario que llenó un formulario.
campo: fechaingreso, ingresas el momento en que rellenó el form.
campo: minutos_baneado, el número de minutos que lo quieres fuera.
Ahora, te fabricas 2 funciones, llamadas:
Cita:
//regresa 1 si la IP está aún baneada, 0 si ya no lo está.
is_banned($ip);

//no regresa valor
bannear_ip($minutos_baneados,$ip);
is_banned($ip);
Recibe como parámetro la IP que quieres consultar. Esta función te regresará un 1 si la IP no está banneada, 0 si lo está.

En forma interna, primero verificará que la IP existe en la BD y si así es, entonces esta función va a hacer una suma:

$fechaliberacion = $fechaingreso + $minutos_baneado;

Tanto fechaingreso como minutos_baneado lo toma de la base de datos y si nota que:

$fechaliberacion < FECHAACTUAL

Puedes simplemente regresar el valor 1 (diciendo que la IP no está banneada) o bien, borrar primero el valor de la tabla y luego entonces regresar el valor 1.


bannear_ip($minutos_baneados,$ip);
Hace una simple inserción a la BD con la IP del visitante que llenó el form.
  #9 (permalink)  
Antiguo 04/02/2006, 10:17
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 12 años, 2 meses
Puntos: 2
thx

ahora me pongo a tratar de hacerlo

saludos

muchas gracias por tu tiempo
__________________
DJJJ
  #10 (permalink)  
Antiguo 06/02/2006, 22:00
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 14 años
Puntos: 0
Solucion 1.
Al darse de alta registre una cookie, y al volver a dar de alta checaba que si estaba registrado no dejaba insertar en la bd pero sino obviamente se insertaba.
Respuesta. No funcionó, siempre me siguieron insertando los registros

Solucion 2. (En proceso)

Código PHP:
// Archivo functions.php

function is_banned($ip)
{
  
$ip $REMOTE_ADDR;
  
$sql mysql_query("SELECT * FROM ips_baneadas WHERE ip='$ip'");

  while(
$row mysql_fetch_array($sql))
   {
    
$fechaingreso $row[date];
    
$minutos $row[minutos_baneados];
   }

   
$total mysql_num_rows($sql);
 
   if(
$total==0) return 0// no baned
   
   
if($total==1)
    {
     
$hoy date("Y-m-d");
     
$fechaliberacion $fechaingreso $minutos;
     if(
$fechaliberacion<$hoy)
     return 
0;
    }
   else
    {
     return 
1// si baned
    
}

Código PHP:
// Archivo afiliados.php al momento de darse de alta

include("conexion.php");

...

include(
"function_security.php");
$ip $REMOTE_ADDR;
$saber is_banned($ip);
if(
$saber==0)
{
 echo 
"<p align='center'><b><font face='Verdana' size='2' color='#FF0000'>Sitio en construcción</font></b></p>";
}
else
{
bannear_ip($ip);
$insertar "INSERT INTO afiliados (id,nombre,url,email) VALUES ('$id','$nombre','$url','$email')";
mysql_query($insertar);
$id mysql_insert_id(); 
El problema esta que la funcion is_banned no funciona :s ya que nunca me regresa valor y siempre es cero.

Espero alguien heche la mano
  #11 (permalink)  
Antiguo 07/02/2006, 03:25
Avatar de nosoynadie  
Fecha de Ingreso: noviembre-2005
Ubicación: dando vueltas por aquí
Mensajes: 206
Antigüedad: 12 años
Puntos: 1
Hola ThunderFx,

mirando tu código me surge una pregunta:

el que la función te devuelva siempre 0, ¿no será por que preguntas por el número de resultados después de hacer uso del mysql_num_rows? Prueba a sacar el valor de $total antes del while:

Código PHP:
function is_banned($ip)
{
    
$ip $REMOTE_ADDR;
    
$sql mysql_query("SELECT * FROM ips_baneadas WHERE ip='$ip'");
    
$total mysql_num_rows($sql);
    while(
$row mysql_fetch_array($sql))
    {
        
$fechaingreso $row[date];
        
$minutos $row[minutos_baneados];
    }
    .......

Prueba a ver si te vale, ciao
__________________
http://www.nosoynadie.net/
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:19.