SlideShare una empresa de Scribd logo
1 de 10
Descargar para leer sin conexión
Validación de formularios

    1. EXPRESIONES REGULARES


             C ontinuamos viendo aspectos referentes a la validación de
               todo lo que el usuario introduce en un formulario y
      posteriormente envía al servidor.

           Ya sabemos que podemos comprobar si el usuario ha introducido
      un dato obligatorio, pero ahora vamos a ir un poco más allá y
      validaremos que lo que ha introducido tiene el formato adecuado.

            El ejemplo más típico lo tenemos en este formulario que estamos
      utilizando para que el usuario se identifique con su email y password.




           Nosotros conocemos el formato o patrón que sigue cualquier
      dirección de correo electrónico, por lo que podremos comparar lo que
      ha introducido el usuario con dicho patrón para saber si, en apariencia,
      el dato introducido es correcto.

           Una vez superada esta validación, ya será momento de
      comprobar si la dirección introducida es la correspondiente a un
      usuario o no.

            Para hacer este tipo de comprobaciones se utilizan expresiones
      regulares, que no son más que una forma de especificar, exactamente,
      el formato que debe cumplir una cadena de texto.

           Por ejemplo, en el caso del email, sabemos que debe incluir un
      carácter arroba (@); que debe aparecer al menos una vez el punto, etc.



Copyright (c) Computer Aided Education S.A.                                  1
Validación de formularios




           Todos estos detalles que decimos de forma tan flexible aquí, se
       pueden expresar exactamente utilizando una expresión regular.

       <?php
       if (!$primeravez)
          if (empty($_POST["email"]))
              echo "<tr><td></td><td class='error'>¡Tiene que
                    introducir su email!</td></tr>";
          elseif (!eregi("^[a-zA-Z0-9_-.]+@[a-zA-Z0-9-]+.
       [a-zA-Z0-9-.]+$", $_POST["email"]))
             echo "<tr><td></td><td class='error'>¡Email no
                    válido!</td></tr>";
       ?>

            Tanto la validación de que se haya escrito algo como de que sea
       una dirección de correo electrónico válida tiene que realizarse una vez
       enviado el formulario al servidor. Así que cambiaremos la condición y
       primero comprobaremos si no es la primera vez.

            Y en la línea elseif escribimos código para cuando no es la
       primera vez y no está vacío. En este caso, tiene que concordar lo
       introducido con una dirección de correo electrónico válida.

            Aquí utilizamos la función eregi para comprobar si la cadena
       introducida por el usuario (que se almacena en el elemento email de
       $_POST) concuerda con la expresión regular pasada como primer
       argumento de la función.

            Es muy difícil conseguir una expresión regular que acepte todas
       las posibles direcciones válidas de correo electrónico. Por eso,
       normalmente es mejor crear una expresión flexible abarcando posibles
       direcciones incorrectas, que otra más concreta que pueda rechazar
       alguna válida:

       ^[a-zA-Z0-9_-.]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$

           Los modelos o expresiones regulares se construyen a partir de
           caracteres que se toman de forma literal y otros que tienen un
           significado especial.

           Para su referencia, aquí se indica el significado de los
           caracteres especiales. El resto se tomarán tal cual se escriben
           en la expresión:

           ^: indica que el patrón siguiente debe aparecer al principio de
           la cadena. Por ejemplo, ^a concordaría con ''ayuda'' pero no
           con ''sin ayuda''.



2
Validación de formularios




         $: indica que el patrón debe aparecer al final de la cadena. Por
         ejemplo, com$ concordaría con ''empresa.com'', pero no con
         ''empresa.com.net''.

         ( ): grupo de caracteres que tienen que concordar
         exactamente en la cadena comparada. Sirve para crear
         subexpresiones.

         [ ]: engloba un conjunto de caracteres optativos. Por ejemplo,
         ca[js]a concordaría tanto con ''caja'' como con ''casa''.

         [^]: engloba un conjunto de caracteres que no deben
         aparecer. Por ejemplo ca[^js]a podría concordar con ''cada'',
         ''cata'', etc., pero no con ''caja'' y ''casa''.

         -: representa un rango de caracteres. Por ejemplo, [1-5]
         representaría los dígitos del 1 al 5.

          .: el punto representa cualquier conjunto de caracteres.

         ?: el interrogante representa cero o una vez los caracteres
         anteriores. Por ejemplo, el patrón ho?a concordaría con
         ''hoja'', ''hola'', ''hora'' e incluso sólo con ''a'', ya que ho sería
         opcional.

         *: el asterisco representa cero o más veces los caracteres
         anteriores. Por ejemplo, ge*m concordaría con ''gm'',
         ''geem'', pero no con ''germ'' o ''grm''.

         +: representa uno o más de los caracteres anteriores. Por
         ejemplo, foto[1-3]+ concordaría con ''foto1'', ''foto2'' o
         ''foto3''.

         {n}: repetir n veces. Por ejemplo, a{5} representaría la
         cadena ''aaaaa''.

         {n1, n2}: representa un rango de posibles repeticiones de los
         caracteres anteriores. Por ejemplo, a{2, 5} concordaría con
         ''aa'', ''aaa'', ''aaaa'' o ''aaaaa''.

         : indica que el siguiente carácter es literal. Sirve para
         especificar caracteres especiales como literales. Por ejemplo,
         4*5 concordaría con la expresión aritmética del producto
         ''4*5''.

         |: representa cadenas alternativas. Por ejemplo, (Juan|Ana)
         concordaría con ''Juan'' o ''Ana''.

           Desde luego, no es nuestra intención estudiar cómo crear
      expresiones regulares, sino darle algunos ejemplos como éste para
      validar las direcciones de correo electrónico u otro tipo de datos
      usuales.

Copyright (c) Computer Aided Education S.A.                                           3
Validación de formularios




            En el caso de que la función eregi devuelva el valor FALSE,
       entonces no se trata de un email válido, por lo que lo indicaremos así:

       echo "<tr><td></td><td class='error'>¡Email no
             válido!</td></tr>";




           Con esto ya estamos realizando dos validaciones: que introduzca
       un email y que ese email tenga un formato válido.

            Fíjese que esto no asegura que la dirección electrónica que hemos
       escrito sea una dirección correcta en nuestra tienda virtual, pero, al
       menos, hemos filtrado aquellas cadenas que no pueden formar una
       dirección válida.

           Otras expresiones útiles:

             Password de como mínimo 6 y máximo 10 caracteres:
             ^[a-zA-Z0-9]{6, 10}$
             URL válida:
        ^(http|https)://(www.)?.+.(com|net|org|es|ar|mx)$

                 ([0-9]{1,2})/([0-9]{1,2})/([0-9]{4}): una fecha
                 en el formato d/m/aaaa.

           Éstas son las funciones de PHP que puede utilizar:

                 ereg(patrón, cadena, [opciones]): comprueba si la
                 cadena pasada como segundo argumento concuerda con
                 el patrón pasado como primer argumento. La
                 comprobación tiene en cuenta la combinación de
                 mayúsculas y minúsculas.


4
Validación de formularios




                eregi(modelo, cadena, [opciones]): como la anterior,
                pero sin tener en cuenta la combinación de mayúsculas y
                minúsculas.

                ereg_replace(patrón, reemplazo, cadena): esta
                función examina cadena buscando coincidencias de
                patrón y reemplaza el texto encontrado con reemplazo.

                eregi_replace(patrón, reemplazo, cadena): igual que
                la anterior, pero sin diferenciar mayúsculas y minúsculas.

                split(patrón, cadena, [límite]): divide la cadena en
                elementos de un array según el patrón especificado.
                Devuelve un array de cadenas, cada una de las cuales es
                una subcadena de cadena formada al dividir ésta en los
                límites formados por la expresión regular patrón. Si
                ocurre un error, devuelve un valor falso.

                Devuelve la cadena modificada. Si no hay coincidencias
                que reemplazar, devuelve la cadena original.

                spliti(patrón, cadena, [límite]): igual que la anterior
                pero sin diferenciar entre mayúsculas y minúsculas.

         Para ejemplos y mayor información referente a estas
         funciones, acuda al manual de PHP.

          De forma parecida podría escribir expresiones regulares para
      muchos otros propósitos. Estas expresiones, junto a las funciones que
      proporciona PHP, permiten filtrar datos incorrectos o no válidos.


    2. LIMPIANDO LA INFORMACIÓN


             V  alidar la información proveniente del usuario es necesario
                para evitar que éste pueda introducir datos que incluso
      pudieran llegar a ser dañinos para nuestro sitio web o sirvieran para
      obtener información confidencial.

             Veámoslo con un ejemplo: el archivo registro.php.

           Recuerde que esta página presenta el formulario donde los
      usuarios tendrán que introducir sus detalles personales a la hora de
      registrarse en la tienda virtual.

            A modo de confirmación de esos datos, habíamos escrito código
      php para mostrarlos una vez el usuario los ha enviado correctamente
      al servidor.


Copyright (c) Computer Aided Education S.A.                                        5
Validación de formularios




            Pues bien, esta práctica cada vez se utiliza menos porque es
       peligroso mostrar en una página web la información que ha
       suministrado el usuario.

            Por ejemplo, si el usuario en lugar de introducir su nombre,
       escribe algo como:

              <script language=''javascript''>
              location.href=''http://www.dominiocracker.com''</script>




            ¿Qué problema hay? Pues que cuando pulsemos en el botón
       Enviar, el servidor ejecutará el código correspondiente a la página de
       confirmación y devolverá ese código JavaScript.

            Como resultado, el navegador lo ejecutará. En este caso lo que se
       consigue es redirigir al usuario a una página distinta, con todo lo que
       esto puede significar.

           Pues bien, sepa que por defecto, la configuración del PHP no
       permitiría que esto funcionara. Esto se consigue estableciendo a On el
       parámetro magic_quotes_gpc del archivo de configuración php.ini.

            El paquete xampp configura el entorno de ejecución php en el
       archivo php.ini situado en la carpeta bin de apache.

              c:apachefriendsxamppapachebinphp.ini


6
Validación de formularios




                          El parámetro magic_quotes_gpc de la configuración del PHP
                     sirve como filtro para la información suministrada vía get, post o como
    Mantenga a
On el paráme-
                     cookies.
 tro magic_quo-
     tes_gpc. No          Si está activado (valor On), entonces se comprueba toda esta
hacerlo repre-
 senta un ries-
                     información y se escapa cualquier comilla simple (') o doble ('').
go importante
   en la seguri-          Esto impediría que se ejecutara el código JavaScript que hemos
            dad.
                     escrito en el formulario, ya que realmente se mostraría así en el código
                     HTML de la página de confirmación:

                            <script language=''javascript''>
                            location.href="www.dominiocracker.es"</script>

                          Fíjese que cada comilla doble que introdujimos en el campo
                     Nombre del formulario ha sido escapada (con las barras inclinadas
                     hacia la izquierda delante de cada comilla), por lo que el código
                     JavaScript no ha llegado a ejecutarse.

                          Como primer aspecto a tener en cuenta, el parámetro
                     magic_quotes_gpc debe estar activado. Sin embargo, esto no es
                     suficiente.

                          En ocasiones será necesario que el usuario pueda introducir texto
                     con caracteres como <, >, etc., que representan un riesgo de seguridad.

                          Para estos casos, PHP proporciona dos funciones que nos pueden
                     ser de utilidad. Lo que deberemos hacer es utilizarlas contra la
                     información suministrada por el usuario para “limpiarla”.

                            Estas dos funciones son: strip_tags y htmlspecialchars.

                               strip_tags: esta función elimina todas las etiquetas HTML del
                               texto, aunque también podemos establecer algunas
                               excepciones.

                            echo strip_tags($_POST["nombre"]);

                            En el caso anterior hubiese devuelto:
                            location.href="www.dominiocracker.com"

                               htmlspecialchars: esta función cambia algunos caracteres
                               especiales por su codificación en HTML. Los cambios son los
                               siguientes:


               Copyright (c) Computer Aided Education S.A.                                        7
Validación de formularios




                             < --> &lt;
                             > --> &gt;
                             & --> &amp;

                            echo htmlspecialchars($_POST["nombre"]);

                          produciría:
                     &lt;script language=&quot;
                     javascript&quot;&gt;location.href=&quot;http://www.dominiocrack
                     er.com&quot;&lt;/script&gt;

                         aunque el navegador mostraría el texto siguiente, sin ejecutarlo
                     como código JavaScript:

                            <script language="javascript">
                            location.href="http://www.dominiocracker.com"</script>

                          Vemos que en el código HTML se muestra el texto completo,
                     pero como se ha codificado mediante la función htmlspecialchars, el
 Otra función        código HTML no incluye < o > sino su correspondiente codificación
   útil para el
propósito que
                     &lt; y &gt;, respectivamente.
estamos vien-
    do es trim,           En resumen, vemos que es necesario validar la información
  que elimina
  los espacios
                     suministrada por el usuario. Esto será incluso más importante cuando
 en blanco al        se guarde en un archivo o en una base de datos.
 principio y al
   final de las
   cadenas de
                          Utilizar sin ninguna prudencia dicha información nos puede
         texto.      llevar a resultados inesperados y, lo que es peor, incluso dañinos para
                     nuestro sitio web.


                   3. COMPROBAR EL FORMULARIO DE ORIGEN


                            E xiste un problema adicional de seguridad cuando trabajamos
                              con la información proveniente del usuario. Se trata de cómo
                     conocer desde qué página se está accediendo a la página que recoge
                     dicha información.

                         Dependiendo de la importancia de los datos suministrados, esto
                     puede ser crucial o no.

                          Imagine esta situación: usted ha preparado la página login.php
                     para que los usuarios puedan identificarse proporcionando su email y
                     contraseña.


  8
Validación de formularios




           A partir de dichos datos, permitirá que puedan comprar en su
      tienda virtual, identificándolos como clientes que ya han sido
      registrados en su base de datos.

           Es decir, que una vez introducidos estos dos detalles
      correctamente en login.php, ese usuario accederá a la página donde
      puede confirmar (por ejemplo, confirmarpedido.php) su compra
      porque ya se ha identificado.

           Lógicamente, a esta última página no debería poder acceder si no
      se ha identificado correctamente. Pero, ¿cómo saber que proviene del
      formulario login.php y no de otra página?

           ¿Cómo impedimos que se acceda directamente a confirmar-
      pedido.php sin pasar primero por la de login? Un usuario podría
      simplemente utilizar el nombre de dicha página en el atributo action
      de su formulario para “engañar” a nuestro sistema.

           Una primera aproximación será comprobar desde dónde se viene.
      Este detalle viene dado a través de la variable HTTP_REFERER del
      array superglobal $_SERVER.

           Sin embargo, no podemos confiar en ese valor porque puede ser
      fácilmente modificable y aparentar el valor que nosotros esperamos
      aunque realmente no se provenga de la página correcta.

           Veremos que es necesario identificar claramente al usuario una
      vez haya pasado por login.php. Y esa forma será a través de cookies
      o variables de sesión.




Copyright (c) Computer Aided Education S.A.                                      9
Manual php lec13.validacion_de_formularios

Más contenido relacionado

La actualidad más candente (20)

Manual excel
Manual excelManual excel
Manual excel
 
Ronny proaño 6º informatica
Ronny proaño 6º informaticaRonny proaño 6º informatica
Ronny proaño 6º informatica
 
Caracteres comodines
Caracteres comodinesCaracteres comodines
Caracteres comodines
 
26 Php. Array Escalar Y Asociativo
26 Php. Array Escalar Y Asociativo26 Php. Array Escalar Y Asociativo
26 Php. Array Escalar Y Asociativo
 
Funciones de texto
Funciones de textoFunciones de texto
Funciones de texto
 
Funciones y fórmulas
Funciones y fórmulasFunciones y fórmulas
Funciones y fórmulas
 
Amariles 22
Amariles 22Amariles 22
Amariles 22
 
ADA 4
ADA 4ADA 4
ADA 4
 
14 structure query language
14 structure query language14 structure query language
14 structure query language
 
REFERENCIAS A CELDAS
REFERENCIAS A CELDASREFERENCIAS A CELDAS
REFERENCIAS A CELDAS
 
Dn12 u3 a18_vsrg
Dn12 u3 a18_vsrgDn12 u3 a18_vsrg
Dn12 u3 a18_vsrg
 
Capitulo 2
Capitulo 2Capitulo 2
Capitulo 2
 
Funciones exel
Funciones exelFunciones exel
Funciones exel
 
Oracle sep 01
Oracle sep 01Oracle sep 01
Oracle sep 01
 
Excel martinez laura
Excel martinez lauraExcel martinez laura
Excel martinez laura
 
Guia de cobol
Guia de cobolGuia de cobol
Guia de cobol
 
Comandos sql
Comandos sqlComandos sql
Comandos sql
 
Unidad iii
Unidad iiiUnidad iii
Unidad iii
 
Mascara de entrada
Mascara de entradaMascara de entrada
Mascara de entrada
 
Java script teoria
Java script teoriaJava script teoria
Java script teoria
 

Destacado

19 Php. Utilizando Formularios
19 Php. Utilizando Formularios19 Php. Utilizando Formularios
19 Php. Utilizando FormulariosJosé M. Padilla
 
Beyond Virtualisation
Beyond VirtualisationBeyond Virtualisation
Beyond VirtualisationRightster
 
Creacion de Formularios
Creacion de FormulariosCreacion de Formularios
Creacion de Formulariosandreponcio
 
Iniciación PHP 5. Programación Web
Iniciación PHP 5. Programación WebIniciación PHP 5. Programación Web
Iniciación PHP 5. Programación WebRightster
 
Traducción Asistidas con Computadoras en Software Libre
Traducción Asistidas con Computadoras en Software LibreTraducción Asistidas con Computadoras en Software Libre
Traducción Asistidas con Computadoras en Software LibreLeonardo J. Caballero G.
 
Construyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHP
Construyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHPConstruyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHP
Construyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHPJesus Castagnetto
 
Formularios
FormulariosFormularios
FormulariosAlien96
 
Educacion con tics
Educacion con ticsEducacion con tics
Educacion con ticsYoly QC
 
Relaciones, consultas y formularios
Relaciones, consultas y formulariosRelaciones, consultas y formularios
Relaciones, consultas y formularios980601
 
Iniciación PHP 5. Arquitectura cliente/servidor
Iniciación PHP 5. Arquitectura cliente/servidorIniciación PHP 5. Arquitectura cliente/servidor
Iniciación PHP 5. Arquitectura cliente/servidorRightster
 
Iniciación PHP 5. Introducción
Iniciación PHP 5. IntroducciónIniciación PHP 5. Introducción
Iniciación PHP 5. IntroducciónRightster
 

Destacado (20)

Bienvenidos al tutorial de
Bienvenidos al tutorial deBienvenidos al tutorial de
Bienvenidos al tutorial de
 
19 Php. Utilizando Formularios
19 Php. Utilizando Formularios19 Php. Utilizando Formularios
19 Php. Utilizando Formularios
 
Beyond Virtualisation
Beyond VirtualisationBeyond Virtualisation
Beyond Virtualisation
 
Creacion de Formularios
Creacion de FormulariosCreacion de Formularios
Creacion de Formularios
 
Iniciación PHP 5. Programación Web
Iniciación PHP 5. Programación WebIniciación PHP 5. Programación Web
Iniciación PHP 5. Programación Web
 
Php Lab01
Php Lab01Php Lab01
Php Lab01
 
Php Lab02
Php Lab02Php Lab02
Php Lab02
 
Traducción Asistidas con Computadoras en Software Libre
Traducción Asistidas con Computadoras en Software LibreTraducción Asistidas con Computadoras en Software Libre
Traducción Asistidas con Computadoras en Software Libre
 
Zencoding cheatsheet, ayuda Memoria
Zencoding cheatsheet, ayuda MemoriaZencoding cheatsheet, ayuda Memoria
Zencoding cheatsheet, ayuda Memoria
 
PhpLab06
PhpLab06PhpLab06
PhpLab06
 
Construyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHP
Construyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHPConstruyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHP
Construyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHP
 
Formularios
FormulariosFormularios
Formularios
 
PhpLab04
PhpLab04PhpLab04
PhpLab04
 
Educacion con tics
Educacion con ticsEducacion con tics
Educacion con tics
 
Relaciones, consultas y formularios
Relaciones, consultas y formulariosRelaciones, consultas y formularios
Relaciones, consultas y formularios
 
Iniciación PHP 5. Arquitectura cliente/servidor
Iniciación PHP 5. Arquitectura cliente/servidorIniciación PHP 5. Arquitectura cliente/servidor
Iniciación PHP 5. Arquitectura cliente/servidor
 
Php Lab03
Php Lab03Php Lab03
Php Lab03
 
PhpLab05
PhpLab05PhpLab05
PhpLab05
 
Iniciación PHP 5. Introducción
Iniciación PHP 5. IntroducciónIniciación PHP 5. Introducción
Iniciación PHP 5. Introducción
 
Metodología GQM
Metodología GQMMetodología GQM
Metodología GQM
 

Similar a Manual php lec13.validacion_de_formularios

Perl6 expresiones regulares
Perl6 expresiones regularesPerl6 expresiones regulares
Perl6 expresiones regularesAlfonso Alba
 
Longitud de cadena y funciones en java
Longitud de cadena y funciones en javaLongitud de cadena y funciones en java
Longitud de cadena y funciones en javaRobert Wolf
 
58 Php. Mensajes De Correo
58 Php. Mensajes De Correo58 Php. Mensajes De Correo
58 Php. Mensajes De CorreoJosé M. Padilla
 
Validacionde Paginas Asp.Net
Validacionde Paginas Asp.NetValidacionde Paginas Asp.Net
Validacionde Paginas Asp.NetUBA
 
Aprendiendo php my sql, javascript, css, html5 capitulo 4 expresiones y contr...
Aprendiendo php my sql, javascript, css, html5 capitulo 4 expresiones y contr...Aprendiendo php my sql, javascript, css, html5 capitulo 4 expresiones y contr...
Aprendiendo php my sql, javascript, css, html5 capitulo 4 expresiones y contr...luigiacarigua
 
Expresiones Regulares definición ejemplos y codigo JS
Expresiones Regulares definición  ejemplos y codigo JSExpresiones Regulares definición  ejemplos y codigo JS
Expresiones Regulares definición ejemplos y codigo JSSaulTapiaAlmidon
 
11 fórmulas compu.docx
11 fórmulas compu.docx11 fórmulas compu.docx
11 fórmulas compu.docxJosuGonzles1
 
Clase 05-expresiones-regulares
Clase 05-expresiones-regularesClase 05-expresiones-regulares
Clase 05-expresiones-regularesDanielMrquez25
 
Manual script usuarios masivos
Manual script usuarios masivosManual script usuarios masivos
Manual script usuarios masivosYimy Pérez Medina
 

Similar a Manual php lec13.validacion_de_formularios (20)

Clase 10 expresiones regulares
Clase 10 expresiones regularesClase 10 expresiones regulares
Clase 10 expresiones regulares
 
Perl6 expresiones regulares
Perl6 expresiones regularesPerl6 expresiones regulares
Perl6 expresiones regulares
 
Tutorial bd y php
Tutorial bd y phpTutorial bd y php
Tutorial bd y php
 
Longitud de cadena y funciones en java
Longitud de cadena y funciones en javaLongitud de cadena y funciones en java
Longitud de cadena y funciones en java
 
58 Php. Mensajes De Correo
58 Php. Mensajes De Correo58 Php. Mensajes De Correo
58 Php. Mensajes De Correo
 
Validacionde Paginas Asp.Net
Validacionde Paginas Asp.NetValidacionde Paginas Asp.Net
Validacionde Paginas Asp.Net
 
Aprendiendo php my sql, javascript, css, html5 capitulo 4 expresiones y contr...
Aprendiendo php my sql, javascript, css, html5 capitulo 4 expresiones y contr...Aprendiendo php my sql, javascript, css, html5 capitulo 4 expresiones y contr...
Aprendiendo php my sql, javascript, css, html5 capitulo 4 expresiones y contr...
 
Curso Bash 3
Curso Bash 3Curso Bash 3
Curso Bash 3
 
2 6 validar_formularios
2 6 validar_formularios2 6 validar_formularios
2 6 validar_formularios
 
Expresiones Regulares definición ejemplos y codigo JS
Expresiones Regulares definición  ejemplos y codigo JSExpresiones Regulares definición  ejemplos y codigo JS
Expresiones Regulares definición ejemplos y codigo JS
 
P1C5 Lenguaje de Expresiones
P1C5 Lenguaje de ExpresionesP1C5 Lenguaje de Expresiones
P1C5 Lenguaje de Expresiones
 
11 fórmulas compu.docx
11 fórmulas compu.docx11 fórmulas compu.docx
11 fórmulas compu.docx
 
Mod2ud2 1
Mod2ud2 1Mod2ud2 1
Mod2ud2 1
 
Clase 05-expresiones-regulares
Clase 05-expresiones-regularesClase 05-expresiones-regulares
Clase 05-expresiones-regulares
 
Curso Bash 2
Curso Bash 2Curso Bash 2
Curso Bash 2
 
Excel
ExcelExcel
Excel
 
Curso HTML 5 & jQuery - Leccion 4
Curso HTML 5 & jQuery - Leccion 4Curso HTML 5 & jQuery - Leccion 4
Curso HTML 5 & jQuery - Leccion 4
 
Manual script usuarios masivos
Manual script usuarios masivosManual script usuarios masivos
Manual script usuarios masivos
 
!Prograc8
!Prograc8!Prograc8
!Prograc8
 
Expresiones regulares
Expresiones regularesExpresiones regulares
Expresiones regulares
 

Manual php lec13.validacion_de_formularios

  • 1. Validación de formularios 1. EXPRESIONES REGULARES C ontinuamos viendo aspectos referentes a la validación de todo lo que el usuario introduce en un formulario y posteriormente envía al servidor. Ya sabemos que podemos comprobar si el usuario ha introducido un dato obligatorio, pero ahora vamos a ir un poco más allá y validaremos que lo que ha introducido tiene el formato adecuado. El ejemplo más típico lo tenemos en este formulario que estamos utilizando para que el usuario se identifique con su email y password. Nosotros conocemos el formato o patrón que sigue cualquier dirección de correo electrónico, por lo que podremos comparar lo que ha introducido el usuario con dicho patrón para saber si, en apariencia, el dato introducido es correcto. Una vez superada esta validación, ya será momento de comprobar si la dirección introducida es la correspondiente a un usuario o no. Para hacer este tipo de comprobaciones se utilizan expresiones regulares, que no son más que una forma de especificar, exactamente, el formato que debe cumplir una cadena de texto. Por ejemplo, en el caso del email, sabemos que debe incluir un carácter arroba (@); que debe aparecer al menos una vez el punto, etc. Copyright (c) Computer Aided Education S.A. 1
  • 2. Validación de formularios Todos estos detalles que decimos de forma tan flexible aquí, se pueden expresar exactamente utilizando una expresión regular. <?php if (!$primeravez) if (empty($_POST["email"])) echo "<tr><td></td><td class='error'>¡Tiene que introducir su email!</td></tr>"; elseif (!eregi("^[a-zA-Z0-9_-.]+@[a-zA-Z0-9-]+. [a-zA-Z0-9-.]+$", $_POST["email"])) echo "<tr><td></td><td class='error'>¡Email no válido!</td></tr>"; ?> Tanto la validación de que se haya escrito algo como de que sea una dirección de correo electrónico válida tiene que realizarse una vez enviado el formulario al servidor. Así que cambiaremos la condición y primero comprobaremos si no es la primera vez. Y en la línea elseif escribimos código para cuando no es la primera vez y no está vacío. En este caso, tiene que concordar lo introducido con una dirección de correo electrónico válida. Aquí utilizamos la función eregi para comprobar si la cadena introducida por el usuario (que se almacena en el elemento email de $_POST) concuerda con la expresión regular pasada como primer argumento de la función. Es muy difícil conseguir una expresión regular que acepte todas las posibles direcciones válidas de correo electrónico. Por eso, normalmente es mejor crear una expresión flexible abarcando posibles direcciones incorrectas, que otra más concreta que pueda rechazar alguna válida: ^[a-zA-Z0-9_-.]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$ Los modelos o expresiones regulares se construyen a partir de caracteres que se toman de forma literal y otros que tienen un significado especial. Para su referencia, aquí se indica el significado de los caracteres especiales. El resto se tomarán tal cual se escriben en la expresión: ^: indica que el patrón siguiente debe aparecer al principio de la cadena. Por ejemplo, ^a concordaría con ''ayuda'' pero no con ''sin ayuda''. 2
  • 3. Validación de formularios $: indica que el patrón debe aparecer al final de la cadena. Por ejemplo, com$ concordaría con ''empresa.com'', pero no con ''empresa.com.net''. ( ): grupo de caracteres que tienen que concordar exactamente en la cadena comparada. Sirve para crear subexpresiones. [ ]: engloba un conjunto de caracteres optativos. Por ejemplo, ca[js]a concordaría tanto con ''caja'' como con ''casa''. [^]: engloba un conjunto de caracteres que no deben aparecer. Por ejemplo ca[^js]a podría concordar con ''cada'', ''cata'', etc., pero no con ''caja'' y ''casa''. -: representa un rango de caracteres. Por ejemplo, [1-5] representaría los dígitos del 1 al 5. .: el punto representa cualquier conjunto de caracteres. ?: el interrogante representa cero o una vez los caracteres anteriores. Por ejemplo, el patrón ho?a concordaría con ''hoja'', ''hola'', ''hora'' e incluso sólo con ''a'', ya que ho sería opcional. *: el asterisco representa cero o más veces los caracteres anteriores. Por ejemplo, ge*m concordaría con ''gm'', ''geem'', pero no con ''germ'' o ''grm''. +: representa uno o más de los caracteres anteriores. Por ejemplo, foto[1-3]+ concordaría con ''foto1'', ''foto2'' o ''foto3''. {n}: repetir n veces. Por ejemplo, a{5} representaría la cadena ''aaaaa''. {n1, n2}: representa un rango de posibles repeticiones de los caracteres anteriores. Por ejemplo, a{2, 5} concordaría con ''aa'', ''aaa'', ''aaaa'' o ''aaaaa''. : indica que el siguiente carácter es literal. Sirve para especificar caracteres especiales como literales. Por ejemplo, 4*5 concordaría con la expresión aritmética del producto ''4*5''. |: representa cadenas alternativas. Por ejemplo, (Juan|Ana) concordaría con ''Juan'' o ''Ana''. Desde luego, no es nuestra intención estudiar cómo crear expresiones regulares, sino darle algunos ejemplos como éste para validar las direcciones de correo electrónico u otro tipo de datos usuales. Copyright (c) Computer Aided Education S.A. 3
  • 4. Validación de formularios En el caso de que la función eregi devuelva el valor FALSE, entonces no se trata de un email válido, por lo que lo indicaremos así: echo "<tr><td></td><td class='error'>¡Email no válido!</td></tr>"; Con esto ya estamos realizando dos validaciones: que introduzca un email y que ese email tenga un formato válido. Fíjese que esto no asegura que la dirección electrónica que hemos escrito sea una dirección correcta en nuestra tienda virtual, pero, al menos, hemos filtrado aquellas cadenas que no pueden formar una dirección válida. Otras expresiones útiles: Password de como mínimo 6 y máximo 10 caracteres: ^[a-zA-Z0-9]{6, 10}$ URL válida: ^(http|https)://(www.)?.+.(com|net|org|es|ar|mx)$ ([0-9]{1,2})/([0-9]{1,2})/([0-9]{4}): una fecha en el formato d/m/aaaa. Éstas son las funciones de PHP que puede utilizar: ereg(patrón, cadena, [opciones]): comprueba si la cadena pasada como segundo argumento concuerda con el patrón pasado como primer argumento. La comprobación tiene en cuenta la combinación de mayúsculas y minúsculas. 4
  • 5. Validación de formularios eregi(modelo, cadena, [opciones]): como la anterior, pero sin tener en cuenta la combinación de mayúsculas y minúsculas. ereg_replace(patrón, reemplazo, cadena): esta función examina cadena buscando coincidencias de patrón y reemplaza el texto encontrado con reemplazo. eregi_replace(patrón, reemplazo, cadena): igual que la anterior, pero sin diferenciar mayúsculas y minúsculas. split(patrón, cadena, [límite]): divide la cadena en elementos de un array según el patrón especificado. Devuelve un array de cadenas, cada una de las cuales es una subcadena de cadena formada al dividir ésta en los límites formados por la expresión regular patrón. Si ocurre un error, devuelve un valor falso. Devuelve la cadena modificada. Si no hay coincidencias que reemplazar, devuelve la cadena original. spliti(patrón, cadena, [límite]): igual que la anterior pero sin diferenciar entre mayúsculas y minúsculas. Para ejemplos y mayor información referente a estas funciones, acuda al manual de PHP. De forma parecida podría escribir expresiones regulares para muchos otros propósitos. Estas expresiones, junto a las funciones que proporciona PHP, permiten filtrar datos incorrectos o no válidos. 2. LIMPIANDO LA INFORMACIÓN V alidar la información proveniente del usuario es necesario para evitar que éste pueda introducir datos que incluso pudieran llegar a ser dañinos para nuestro sitio web o sirvieran para obtener información confidencial. Veámoslo con un ejemplo: el archivo registro.php. Recuerde que esta página presenta el formulario donde los usuarios tendrán que introducir sus detalles personales a la hora de registrarse en la tienda virtual. A modo de confirmación de esos datos, habíamos escrito código php para mostrarlos una vez el usuario los ha enviado correctamente al servidor. Copyright (c) Computer Aided Education S.A. 5
  • 6. Validación de formularios Pues bien, esta práctica cada vez se utiliza menos porque es peligroso mostrar en una página web la información que ha suministrado el usuario. Por ejemplo, si el usuario en lugar de introducir su nombre, escribe algo como: <script language=''javascript''> location.href=''http://www.dominiocracker.com''</script> ¿Qué problema hay? Pues que cuando pulsemos en el botón Enviar, el servidor ejecutará el código correspondiente a la página de confirmación y devolverá ese código JavaScript. Como resultado, el navegador lo ejecutará. En este caso lo que se consigue es redirigir al usuario a una página distinta, con todo lo que esto puede significar. Pues bien, sepa que por defecto, la configuración del PHP no permitiría que esto funcionara. Esto se consigue estableciendo a On el parámetro magic_quotes_gpc del archivo de configuración php.ini. El paquete xampp configura el entorno de ejecución php en el archivo php.ini situado en la carpeta bin de apache. c:apachefriendsxamppapachebinphp.ini 6
  • 7. Validación de formularios El parámetro magic_quotes_gpc de la configuración del PHP sirve como filtro para la información suministrada vía get, post o como Mantenga a On el paráme- cookies. tro magic_quo- tes_gpc. No Si está activado (valor On), entonces se comprueba toda esta hacerlo repre- senta un ries- información y se escapa cualquier comilla simple (') o doble (''). go importante en la seguri- Esto impediría que se ejecutara el código JavaScript que hemos dad. escrito en el formulario, ya que realmente se mostraría así en el código HTML de la página de confirmación: <script language=''javascript''> location.href="www.dominiocracker.es"</script> Fíjese que cada comilla doble que introdujimos en el campo Nombre del formulario ha sido escapada (con las barras inclinadas hacia la izquierda delante de cada comilla), por lo que el código JavaScript no ha llegado a ejecutarse. Como primer aspecto a tener en cuenta, el parámetro magic_quotes_gpc debe estar activado. Sin embargo, esto no es suficiente. En ocasiones será necesario que el usuario pueda introducir texto con caracteres como <, >, etc., que representan un riesgo de seguridad. Para estos casos, PHP proporciona dos funciones que nos pueden ser de utilidad. Lo que deberemos hacer es utilizarlas contra la información suministrada por el usuario para “limpiarla”. Estas dos funciones son: strip_tags y htmlspecialchars. strip_tags: esta función elimina todas las etiquetas HTML del texto, aunque también podemos establecer algunas excepciones. echo strip_tags($_POST["nombre"]); En el caso anterior hubiese devuelto: location.href="www.dominiocracker.com" htmlspecialchars: esta función cambia algunos caracteres especiales por su codificación en HTML. Los cambios son los siguientes: Copyright (c) Computer Aided Education S.A. 7
  • 8. Validación de formularios < --> &lt; > --> &gt; & --> &amp; echo htmlspecialchars($_POST["nombre"]); produciría: &lt;script language=&quot; javascript&quot;&gt;location.href=&quot;http://www.dominiocrack er.com&quot;&lt;/script&gt; aunque el navegador mostraría el texto siguiente, sin ejecutarlo como código JavaScript: <script language="javascript"> location.href="http://www.dominiocracker.com"</script> Vemos que en el código HTML se muestra el texto completo, pero como se ha codificado mediante la función htmlspecialchars, el Otra función código HTML no incluye < o > sino su correspondiente codificación útil para el propósito que &lt; y &gt;, respectivamente. estamos vien- do es trim, En resumen, vemos que es necesario validar la información que elimina los espacios suministrada por el usuario. Esto será incluso más importante cuando en blanco al se guarde en un archivo o en una base de datos. principio y al final de las cadenas de Utilizar sin ninguna prudencia dicha información nos puede texto. llevar a resultados inesperados y, lo que es peor, incluso dañinos para nuestro sitio web. 3. COMPROBAR EL FORMULARIO DE ORIGEN E xiste un problema adicional de seguridad cuando trabajamos con la información proveniente del usuario. Se trata de cómo conocer desde qué página se está accediendo a la página que recoge dicha información. Dependiendo de la importancia de los datos suministrados, esto puede ser crucial o no. Imagine esta situación: usted ha preparado la página login.php para que los usuarios puedan identificarse proporcionando su email y contraseña. 8
  • 9. Validación de formularios A partir de dichos datos, permitirá que puedan comprar en su tienda virtual, identificándolos como clientes que ya han sido registrados en su base de datos. Es decir, que una vez introducidos estos dos detalles correctamente en login.php, ese usuario accederá a la página donde puede confirmar (por ejemplo, confirmarpedido.php) su compra porque ya se ha identificado. Lógicamente, a esta última página no debería poder acceder si no se ha identificado correctamente. Pero, ¿cómo saber que proviene del formulario login.php y no de otra página? ¿Cómo impedimos que se acceda directamente a confirmar- pedido.php sin pasar primero por la de login? Un usuario podría simplemente utilizar el nombre de dicha página en el atributo action de su formulario para “engañar” a nuestro sistema. Una primera aproximación será comprobar desde dónde se viene. Este detalle viene dado a través de la variable HTTP_REFERER del array superglobal $_SERVER. Sin embargo, no podemos confiar en ese valor porque puede ser fácilmente modificable y aparentar el valor que nosotros esperamos aunque realmente no se provenga de la página correcta. Veremos que es necesario identificar claramente al usuario una vez haya pasado por login.php. Y esa forma será a través de cookies o variables de sesión. Copyright (c) Computer Aided Education S.A. 9