Foros del Web » Programando para Internet » PHP »

Tratar cadenas entrada formulario

Estas en el tema de Tratar cadenas entrada formulario en el foro de PHP en Foros del Web. Hola, Estoy "intentando" hacer una web tirando de bases de datos y claro está, muhas veces debo consultar la base de datos´utilizando los parámetros que ...
  #1 (permalink)  
Antiguo 17/02/2004, 06:05
 
Fecha de Ingreso: febrero-2004
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 0
Tratar cadenas entrada formulario

Hola,

Estoy "intentando" hacer una web tirando de bases de datos y claro está, muhas veces debo consultar la base de datos´utilizando los parámetros que introduce el usuario a través de un formulario.

La cos, claro está, es que antes de crear la query de SQL quiero tratar esa cadena para evitar la famosa inyección de codigo SQL.

Por lo que he leido hasta ahora la gente habla de usar la función addslashes() o
return " ' ". mysql_espace_string ($cadena_del_formulario) . " ' "; (esto último creo que se hace de forma automática si tenemos activo magic_quotes_gpc en el php.ini

La diferencia entre la primera versión y la segunda radica en el tipo de caracrteres que escapan.

...la pregunta es...¿que haceis vosotros y como siempre xq???

Un saludo a todos
  #2 (permalink)  
Antiguo 17/02/2004, 06:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si trabajas con Mysql .. usando la función:

mysql_espace_string()

Esa función no depende del estado de la directiva magic_quotes_gpc .. así que si no estubiera a ON (como suele venir PHP por defecto) .. se escaparían los caracteres conflictivos como esas ' y similares para el SQL en sí.

Puedes leer estos artículos sobre el tema:
http://www.sitepoint.com/article/794
(está enfocado a ASP .. pero como teoría es aplicable a PHP y otras BD)
http://freephp.html.it/articoli/view...olo.asp?id=123
(enfocado a PHP y Msyql .. en Italiano)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 17/02/2004 a las 06:48
  #3 (permalink)  
Antiguo 17/02/2004, 06:48
 
Fecha de Ingreso: febrero-2004
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 0
A lo que me refería cuando activas magic_quotes_gpc es que no hace falta hacer mysql_espace_string() ya que esto se hace de manera automática para cada sentencia SQL que ejecutamos...creo que eso fue lo que lei...pero ahora me quedo en dudas...

Por otro lado me he encontrado esto para tratar de un golpe todas las variables del POST:

<?php
foreach ($_POST as $postvarname => $rawpostcontent)
{
array_push($_POST[$postvarname], strip_tags(substr(trim($rawpostcontent),0,250)));
}
?>

finalmente que cual es la mejor solución?? y xq descartar addslashes()??

Un saludo
  #4 (permalink)  
Antiguo 17/02/2004, 06:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Las funcioens de Mysql própias desde PHP como mysql_scape_string() o las que tiene Postgresql pg_escape() (o similar) hace lo mismo que addslashes() en el caso de que magic_quote_gpc() estubiera a ON ..

Es más puedes "preguntar" por el estado de esa directiva para usar o no tu addslashes(). En lugar de la própia función para una determinada Base de datos si es que la dispone y así hacerte rutinas "genéricas" de tratamiento de cadenas externas (que llenguen desde un formulario, link, cookies ...) hacia las funciones que generen SQL para deteminado motor de BD).

En el último link que acabo de dejar .. en ese artículo se dán várias alternativas para evitar los problemas con el SQL injectión .. Com usar expresiones regulares para filtrar tu cadena .. o si usas identificadores numéricos para los típicos "ID" .. forzar el tipo de dato a numérico .. o chekear si es del tipo esperado tu variable para no continuar con el proceso .. etc.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 17/02/2004, 06:56
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

La razon de "descartar" addslashes() es que se supone que puede no coincidir el subconjunto de caracteres que escapan. Y se supone que mysql_escape_string() escapa los caracteres "peligrosos" para mysql.

Yo ademas de escapar las cadenas, fuerzo a que los parametros numericos sean numericos. Por ejemplo, los ID, los que se usan para el LIMIT. Para eso uso settype() (www.php.net/settype).

Saludos.

PD: La maxima de seguridad es no confiar en nada que venga de fuera del script.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #6 (permalink)  
Antiguo 17/02/2004, 06:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
A lo que me refería cuando activas magic_quotes_gpc es que no hace falta hacer mysql_espace_string() ya que esto se hace de manera automática para cada sentencia SQL que ejecutamos...creo que eso fue lo que lei...pero ahora me quedo en dudas...
En general no es para cada sentencia SQL.. sino más bien para toda variable externa de tu script que le entre por método GET, POST o cookies (he de ahí las sigas "gpc": get, post, cookie). Ahora .. que lo apliques directo a una cadena que va a generar una sentencia SQL .. ok, pero eso es válido para toda variable.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 17/02/2004, 07:41
 
Fecha de Ingreso: febrero-2004
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 0
Resumiendo....
para cada entrada del usuario por formulario si el tipo que espero es de tipo string utilizo mysql_escape_string() y para las que espero que sean integer transformo el valor que me introduce el usario con settype() a integer y luego compruebo que esté en el rango que a mí me interese.

El conveniente limitar el tamaño de las variables de tipo string a un tamaño para evitar cosas como buffer overflow???

Y por último es cierto que tambien debería tratar las variables del POST, GET y Cookies...se supone que el proceso es el mismo??, es decir, obtengo la varaible y la trato segun sea de tipo string o integer (forando su tipo) y luego ya puedo jugar con ella dentro de mi palicacion, no???

Y como nota final, ya que hablamos de "seguridad" he leido algo de que te pueden hacer algo como:
http://server.com/file.php?id=45<script> ...... lo que sea </script>
alguna sugerencia respecto a esto??

Un saludo
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 08:36.