Foros del Web » Programando para Internet » PHP »

Es seguro este script?

Estas en el tema de Es seguro este script? en el foro de PHP en Foros del Web. Hola Formulario Código: <form action="enviar.php" method="post"> <input name=selecc[] type=checkbox value="`clasif`='a' AND `tipo`='v'" /> <input name=selecc[] type=checkbox value="`clasif`='b' AND `tipo`='c'" /> </form> Código PHP:   if (isset( ...
  #1 (permalink)  
Antiguo 09/12/2006, 13:09
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
Es seguro este script?

Hola

Formulario
Código:
<form action="enviar.php" method="post">
<input name=selecc[] type=checkbox value="`clasif`='a' AND `tipo`='v'" />
<input name=selecc[] type=checkbox value="`clasif`='b' AND `tipo`='c'" />
</form>
Código PHP:
 if (isset($_POST['selecc']))
  {
     
$selecc $_POST['selecc'];
     
$n        count($selecc);
     
$i        0;
  
     
$input="SELECT * FROM `productos` WHERE ";
     while (
$i $n)
     {
     if(
$i>0){
     
$input.=" OR ";
     }
     
$contensql=stripslashes($selecc[$i]);
        
$input.=$contensql;
        
$i++;
     }
     
  } 
Con la variable input, se va a hacer una consulta, pero en lo que se envio desde el formulario es un fragmento de mi consulta sql, lo cual es suceptible a una inyeccion sql

Que puedo hacer para evitarlo, se me ocurre que generar un numero aleatorio y guardarlo en session, pero creo que tambien no es 100% seguro, o si aumenta la seguridad sustancialmente? o mejor con un codigo visual? que por cierto ya tengo hecho

O como le podria hacer?, para hacerlo mas seguro?

Gracias de antemano
  #2 (permalink)  
Antiguo 09/12/2006, 19:34
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Es seguro este script?

Nunca es la mejor opción usar código sql como parte de los datos enviados, uno tiene que pensar siempre en que una persona con el suficiente tiempo libre puede terminar obteniendo información que no queremos que tenga.
Aunque en algún caso (quizás en la mayoría) no haya un peligro real, las buenas costumbres no están de más

Creo que una solución sencilla puede ser sustituir cada opción por un código numérico, y luego en el programa mismo elegir la opción que corresponda a partir de ese código (por ejemplo, que 1 corresponda con `clasif`='a' AND `tipo`='v')


Saludos.
  #3 (permalink)  
Antiguo 10/12/2006, 09:52
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
Re: Es seguro este script?

Cita:
Iniciado por alvlin Ver Mensaje
Nunca es la mejor opción usar código sql como parte de los datos enviados, uno tiene que pensar siempre en que una persona con el suficiente tiempo libre puede terminar obteniendo información que no queremos que tenga.
Aunque en algún caso (quizás en la mayoría) no haya un peligro real, las buenas costumbres no están de más

Creo que una solución sencilla puede ser sustituir cada opción por un código numérico, y luego en el programa mismo elegir la opción que corresponda a partir de ese código (por ejemplo, que 1 corresponda con `clasif`='a' AND `tipo`='v')


Saludos.
Tambien temo eso, pero lo que mas temo que puedan hacer es un UPDATE o hasta un DROP a mis tablas

Estaba pensando que al recibir los datos del formulario haga una condicional con $_SERVER['HTTP_REFERER'] verificando que el formulario provenga desde mi formulario y no de otro lado, con esto le dara mas seguridad?
  #4 (permalink)  
Antiguo 10/12/2006, 11:51
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Es seguro este script?

Si hacés como te comento en el mensaje anterior (con números para cada opción) la validación de datos es sencilla y además separás los datos enviados de la consulta.
Si vos solamente aceptás números entre 1 y 4 (por ejemplo) y luego dependiendo del número recibido ejecutás una acción u otra, ya no hay forma de que te hagan una inyección SQL.

Usar el REFERER no te serviría de nada, tené en cuenta que es muy probable que un supuesto atacante tenga tiempo libre como para probar: si bien le será quizás complicado adivinar que le falta el referer, no hay que olvidar que al igual que cualquier otra cabecera, es fácilmente modificable.
Esto resulta en que muy probablemente si alguien te ataca falsee esa cabecera (y todas las que quiera)

Un consejo final si estás preocupado por la seguridad: conectate a MySQL con un usuario con privilegios de solo lectura. Entonces nohay modificación posible a los datos de tu base. El cambio de privilegios lo podés hacer con una herramienta tipo phpmyadmin o desde el panel de control de tu sitio.


Saludos.
  #5 (permalink)  
Antiguo 12/12/2006, 13:00
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
Re: Es seguro este script?

Hola, gracias por responder, como dices se podria hacer, pero mas seguro, seria poner algo asi en el valor del input

valor1,valor2

Posteriormente en el ciclo hacer un EXPLODE, obteniendo en arrays, los elementos separados, en este caso por comas, pero logicamente hay que crear otra ciclo, para recorrer ese ciclo, lo cual es agregar mas carga al servidor

Tambien me gustaria decir, que las sessiones no son cabeceras, sino mas bien una variable creada en el servidor

Lo que se podria tambien hacer es generar un numero unico con un token

$_SESSION['identificador'] = uniqid(rand(), true);


Posteriormente verificar la existencia de el o incluso usando un codigo visual

Saludos
  #6 (permalink)  
Antiguo 13/12/2006, 12:05
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Es seguro este script?

Sé que las sesiones no son una cabecera, pero su identificador único se envía por Cookie (que sí es una cabecera). Además me refería a la cabecera Referer..

Pero en fin, creo que no es necesario hacer 2 bucles:
Código PHP:
foreach($_POST['selecc'] as $valor) {
 if (
$valor 'valor correspondiente al primer checkbox'
  
$consulta .= " OR `clasif`='a' AND `tipo`='v'";
 else
  
$consulta .= " OR `clasif`='b' AND `tipo`='c'";
 } 
La idea debe ser quitar el SQL del formulario.
Así no das información que puedan usar para atacarte.
Si vos controlás los valores que te pueden pasar, validándolos correctamente, no es necesario que te preocupes por quién manda el formulario, ya que por mucha basura que te manden, la validación solo dejará pasar lo que sea inofensivo...


Saludos.
  #7 (permalink)  
Antiguo 18/12/2006, 12:00
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
Re: Es seguro este script?

Hola, antes que nada, feliz navidad y feliz año nuevo

Muchas gracias si voy a seguir tu consejo de no poner el sql en el html
y no sabia que la sessiones fueran guardadas en cookies, hasta que me dijiste

Y deshabilitando cookies, es cierto mi paginador no funciona y nada funciona y eso seria terrible si el usuario no tiene habilitado cookies

Y cuando tengo habilitado cookies, la aplicacion funciona bien, pero muestra un error

Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0

Entonces, debo de dejar de usar sessiones, pero que podria usar? porque el $_POST solo funciona para enviar informacion desde formularios no para vinculos que yo sepa, lo que estaba pensando era guardar lo necesario en un archivo en el servidor(lo cual el tiempo de ejecuciondel script, seria alto) o usar una tabla en la base de datos "con una especie de temporales", seria un tiempo de ejecucion bajo pero un gasto de recursos alto

O tu que me recomiendas?

Última edición por August; 18/12/2006 a las 12:15
  #8 (permalink)  
Antiguo 18/12/2006, 13:32
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Es seguro este script?

Sinceramente no conozco el error con detalle, pero al hablar de register_globals, supongo que cualquier problema queda solucionado siempre que uses la matriz $_SESSION para acceder a los datos... a mí nunca me ha dado problemas.
En cualquier caso, si estás probando en un servidor local y/o tenés acceso al php.ini, agregale:

session.bug_compat_42 = off
session.bug_compat_warn = off

y probá si tu programa funciona correctamente.

En cuanto a las sesiones, cabe aclarar que solo se envía en una cookie el identificador de sesión, mientras que los datos de las variables de la sesión se guardan en el servidor.

Quizás quieras investigar el uso de session.use_trans_sid para solucionar el tema de las cookies desactivadas


Saludos.
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 10:54.