Como validar campos en php?

100 views
Skip to first unread message

carpincho

unread,
May 22, 2009, 6:41:04 PM5/22/09
to PHP Argentina
Hola, queria que me cuenten, como valida campos cada uno.
Cual es la forma mas segura de hacerlo?
En php? javascript? otra?

Yo lo estaba haciendo en javascript, pero me dijeron que tiene varias
falencias...
en fin solo eso.
Saludos
J.

Sebastian Choren

unread,
May 22, 2009, 10:08:08 PM5/22/09
to php...@googlegroups.com
Por PHP es mas seguro, el javascript se puede deshabilitar y te pasan la validacion por encima.
Yo lo que hago es hacer la validacion por JS para no tirarle request al pedo al server, y despues valido por php para q no me injecten cosas raras.

Me parece que es lo mas seguro

Espero que te sirva
Sebastián Choren


2009/5/22 carpincho <carp...@gmail.com>

Tordek

unread,
May 22, 2009, 10:24:11 PM5/22/09
to php...@googlegroups.com
> Hola, queria que me cuenten, como valida campos cada uno.
> Cual es la forma mas segura de hacerlo?
> En php? javascript? otra?
Definí "Validar"... Validar es distinto a Sanitizar: Por un lado, no
se puede Sanitizar por lado del cliente; con deshabilitar JS se te
rien en la cara.

Validar es asegurarte que los campos tengan un contenido aceptable
(que el campo e-mail se parezca a un e-mail; que todas las opciones
requeridas estén rellenas, etc.). Sanitizar es limpiar lo que te pasó
el usuario antes de ejecutar.

La validación sí o sí la tenés que hacer en el server: Si los datos
son inválidos, no podés meterlos en la DB porque te van a saltar las
constraints.

Opcionalmente, también podés hacerla del lado del cliente: Te ahorrás
el ida-y-vuelta para avisar "te falta esto", y el cliente tiene el
aviso más rápido.

Ahora, _validar_ un campo no da ninguna promesa de _seguridad_ (Que
hayas preguntado "cual es más seguro" es lo que me hace pensar que no
sabías realmente lo que es validar): Si hablamos técnicamente, una
dirección de e-mail acepta comentarios entre paréntesis, donde puedo
poner cualquier contenido (bueno, no "cualquiera"). Por esa
definición, direccion(';drop table users--)@ejemplo.com es VÁLIDA
(creo... a lo mejor hay que escapar esas comillas... no tengo ganas de
leerme el RFC entero). Ahora, no es SEGURA; no está SANITIZADA. Si
meto eso en mi DB sin la sanitización apropiada, no pasan cosas
buenas.

La sanitización también la tenés que hacer del lado del server.
Hacerla del lado del cliente no tiene sentido: Para los que no saben
cómo hacer un ataque, es esfuerzo desperdiciado. Para los que sí
saben, lo desactivan trivialmente...

Con eso dicho: yo no me preocupo demasiado por la sanitización
(add_slashes? mysql_escape? mysql_real_escape?), simplemente uso PDO,
y le paso los strings posiblemente insalubres como parámetro, que se
encargue de escapar alguien que sepa.

> Saludos
> J.

Tordek.

Joaquin Tita

unread,
May 22, 2009, 11:20:45 PM5/22/09
to php...@googlegroups.com
Gracias Seba y Tordek.

@Seba: justamente, sabía del inconveniente de deshabilitar el js...
pero pensaba que podía existir alguna forma de "No puede continuar
Tiene js deshabilitado bla bla", o alguna mejora de js la cual no estaba informado,
(soy conciente del problema de la función eval)..
(eso con respecto a la validación de campos de formulario)

@Tordek:
En realidad, la duda era un poco todo lo que dijiste.
Si, eso lo sé (sobre deshabilitar js), pero bueno, pensé que por ahi existia
alguna técnica "novedosa" que no estaba al tanto, o algo revolucionario.
Además, conocer la opinión, punto de vista, de otros developers,
"si hacé esto; eso no, es malo; tal otra cosa tiene
problemas de seguridad; eso es muy complicado, probá aquello", etc.
Quería algunas opiniones al respecto de cómo sanitizar y cómo validar
(esta bien separar las dos cosas, expresé mal la pregunta, mis disculpas)
 
"[..]no podés meterlos en la DB porque te van a saltar las
constraints
"
Supongo que estas hablando de integridad de los datos, asserts, triggers, etc...

"validar un campo no da ninguna promesa de seguridad (Que

hayas preguntado "cual es más seguro" es lo que me hace pensar que no
sabías realmente lo que es validar)"

Obviamente que no, pero la idea es, tratar de hacer códigos robustos (desde todo aspecto)
(si mezclé las dos ideas, perdón por eso también)


"direccion(';drop table users--)@ejemplo.com es VÁLIDA
(creo... a lo mejor hay que escapar esas comillas... no tengo ganas de
leerme el RFC entero). Ahora, no es SEGURA; no está SANITIZADA. Si
meto eso en mi DB sin la sanitización apropiada, no pasan cosas
buenas."

Si lo entiendo, tipico caso de sql injection.



"La sanitización también la tenés que hacer del lado del server.
Para los que no saben cómo hacer un ataque, es esfuerzo desperdiciado.
Para los que sí saben, lo desactivan trivialmente..."
Como la desactivan trivialmente?


"simplemente uso PDO,
y le paso los strings posiblemente insalubres como parámetro, que se
encargue de escapar alguien que sepa."

No entendí eso, como que se encargue alguien que sepa?

Saludos
J.

pd: no bardees, tenés razón expresé para la mierda la pregunta.

2009/5/22 Tordek <ked...@gmail.com>

Gaston Gorosterrazu

unread,
May 22, 2009, 11:34:02 PM5/22/09
to php...@googlegroups.com
Es mas simple la explicación:

Javascript: "Validación" para ayudar al usuario a llenar el formulario.
PHP: "Validación" de seguridad.

La mejor: ninguna.
Lo ideal: ambas.
Si por alguna razón extraña sólo podes tener 1: PHP (con PHP podés hacer lo que haría javascript, pero mas feo, mientras que con Javascript no podés hacer lo de PHP)

G

2009/5/23 Joaquin Tita <carp...@gmail.com>

Tordek

unread,
May 23, 2009, 12:13:35 AM5/23/09
to php...@googlegroups.com
> "La sanitización también la tenés que hacer del lado del server.
> Para los que no saben cómo hacer un ataque, es esfuerzo desperdiciado.
> Para los que sí saben, lo desactivan trivialmente..."
> Como la desactivan trivialmente?

"La tenés que hacer del lado del server [porque si solo lo hacés del
lado del cliente] la pueden desactivar trivialmente"; me comí tres
cuartos de oración.

> "simplemente uso PDO,
> y le paso los strings posiblemente insalubres como parámetro, que se
> encargue de escapar alguien que sepa."
> No entendí eso, como que se encargue alguien que sepa?

A PDO le digo:
$query = $connection->prepare("SELECT * FROM a WHERE a.b = :param");
$query->bindValue(":param", $_GET['param']);

Dejo que PDO (o sea, el que programó PDO: "otro que sabe más que yo de
inyección") se encargue de preparar la query y meter los parámetros
como mejor corresponda.

>
> Saludos
> J.
>
> pd: no bardees, tenés razón expresé para la mierda la pregunta.

p.d: ¿Bardeé? No pretendía hacerlo :S...

Ariel

unread,
May 23, 2009, 1:18:39 AM5/23/09
to php...@googlegroups.com
Hola soy nuevo en PHP y con respecto a la consulta sobre "validar" pongo un ejemplo a consideracion de ustedes; es una validacion doble, el ejemplo trata sobre el CUIT o CUIL que nos da la AFIP,  primero lo paso por una expresion regular, para saber si esta bien escrito. Y segundo, que ahi viene la validacion es realizar el calculo de VALIDACION de la afip para saber si el CUIT o CUIL es valido.
Es un pequeño Script en PHP, me gustaria saber la opinion al respecto del script.

PD: Si alguien me puede explicar que significa "sanitización" es la primera vez que lo escucho.

     Gracias, adjunto Script.

          Saludos, espero que sirva el ejemplo.
VerificacionCuit.zip

Sebastian Choren

unread,
May 23, 2009, 2:25:52 AM5/23/09
to php...@googlegroups.com
Sanitizar es limpiar los datos que te pone el usuario. Por ejemplo, si tengo un query en un buscador que es:

$sql = "SELECT * FROM usuarios WHERE username = '".$_GET['username']."';

y el usuario te pasa como paremetro " ';DROP TABLE usuarios;-- " el query final es:

$sql = "SELECT * FROM usuarios WHERE username = ' ';DROP TABLE usuarios; --';

te borra la tabla usuarios cuando ejecutas el query.

Ahora, si el query lo armas asi:

$sql = "SELECT * FROM usuarios WHERE username = '".mysql_real_escape_string($_GET['username'])."';

el query final con ese mismo parametro es:

$sql = "SELECT * FROM usuarios WHERE username = ' \';DROP TABLE usuarios; --';

Cuando escapa los caracteres raros como ' o ", evitas cualquier tipo de injection SQL. Eso es sanitizar los datos.


Sebastián Choren


2009/5/23 Ariel <ariel.te...@gmail.com>

Ariel

unread,
May 23, 2009, 11:56:01 AM5/23/09
to php...@googlegroups.com
Estimado
Sebastian
                Muchas gracias por responderme, osea seria como sanear la setencia... ante las introducciones de codigo del usuario no tan comun, me sirvio el ejemplo para darme cuenta muchas gracias.

                Saludos.

_Javi

unread,
Jun 1, 2009, 10:44:49 AM6/1/09
to PHP Argentina
Lo q' yo hago es validar con Javascript del lado del cliente, validar
con PHP del servidor y limpiar las variables con PHP del lado del
servidor.
Reply all
Reply to author
Forward
0 new messages