Tutorial PHP

PHP INICIO Introducción PHP Instalación de PHP Sintaxis PHP Comentarios PHP Variables PHP PHP Echo / Imprimir Tipos de datos PHP Cadenas PHP Números PHP Matemáticas PHP Constantes PHP Operadores PHP PHP Si... Más... Elseif Cambio de PHP Bucles de PHP Funciones PHP Matrices de PHP Superglobales de PHP PHP expresión regular

Formularios PHP

Manejo de formularios PHP Validación de formulario PHP Formulario PHP requerido Formulario PHP URL/Correo electrónico Formulario PHP completo

PHP Avanzado

Fecha y hora PHP PHP Incluir Manejo de archivos PHP Archivo PHP Abrir/Leer Archivo PHP Crear/Escribir Carga de archivos PHP Cookies PHP Sesiones PHP Filtros PHP Filtros PHP avanzados Funciones de devolución de llamada de PHP PHPJSON Excepciones de PHP

POO de PHP

PHP ¿Qué es la programación orientada a objetos? Clases PHP/Objetos Constructor PHP Destructor PHP Modificadores de acceso de PHP Herencia de PHP Constantes PHP Clases abstractas de PHP Interfaces PHP Características de PHP Métodos estáticos de PHP Propiedades estáticas de PHP Espacios de nombres de PHP Iterables de PHP

Base de datos MySQL

Base de datos MySQL Conexión MySQL MySQL Crear base de datos Crear tabla MySQL MySQL Insertar datos MySQL Obtener la última identificación MySQL Insertar Múltiples MySQL preparado Datos seleccionados de MySQL mysql donde MySQL Ordenar por MySQL Eliminar Datos Datos de actualización de MySQL Límite de datos de MySQL

PHPXML _

Analizadores PHP XML Analizador PHP SimpleXML PHP SimpleXML - Obtener PHP XML Expatriados PHP XML DOM

PHP -AJAX

Introducción a AJAX AJAXPHP Base de datos AJAX XML AJAX Búsqueda en vivo de AJAX Encuesta AJAX

Ejemplos de PHP

Ejemplos de PHP Compilador PHP Cuestionario de PHP Ejercicios PHP Certificado PHP

Referencia PHP

Descripción general de PHP Matriz de PHP Calendario PHP Fecha PHP Directorio PHP Error PHP Excepción PHP Sistema de archivos PHP Filtro PHP PHPFTP PHPJSON Palabras clave PHP PHP Libxml Correo PHP Matemáticas PHP PHP misceláneo PHP MySQLi Red PHP Control de salida de PHP PHP expresión regular PHP SimpleXML flujo PHP Cadena PHP Manejo de variables de PHP Analizador PHP XML código postal de PHP Zonas horarias de PHP

Validación de formulario PHP


Este y los siguientes capítulos muestran cómo usar PHP para validar datos de formularios.


Validación de formulario PHP

¡Piense en SEGURIDAD al procesar formularios PHP!

Estas páginas mostrarán cómo procesar formularios PHP teniendo en cuenta la seguridad. ¡La validación adecuada de los datos del formulario es importante para proteger su formulario de piratas informáticos y spammers!

El formulario HTML en el que trabajaremos en estos capítulos contiene varios campos de entrada: campos de texto obligatorios y opcionales, botones de radio y un botón de envío:

Las reglas de validación para el formulario anterior son las siguientes:

Field Validation Rules
Name Required. + Must only contain letters and whitespace
E-mail Required. + Must contain a valid email address (with @ and .)
Website Optional. If present, it must contain a valid URL
Comment Optional. Multi-line input field (textarea)
Gender Required. Must select one

Primero veremos el código HTML simple para el formulario:



Campos de texto

Los campos de nombre, correo electrónico y sitio web son elementos de entrada de texto, y el campo de comentarios es un área de texto. El código HTML se ve así:

Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>

Botones de radio

Los campos de género son botones de radio y el código HTML se ve así:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other

El elemento de forma

El código HTML del formulario se ve así:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Cuando se envía el formulario, los datos del formulario se envían con method="post".

¿Qué es la variable $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] es una variable súper global que devuelve el nombre de archivo del script que se está ejecutando actualmente.

Entonces, $_SERVER["PHP_SELF"] envía los datos del formulario enviado a la página misma, en lugar de saltar a una página diferente. De esta forma, el usuario recibirá mensajes de error en la misma página que el formulario.

¿Qué es la función htmlspecialchars()?

La función htmlspecialchars() convierte los caracteres especiales en entidades HTML. Esto significa que reemplazará caracteres HTML como < y > con < y >. Esto evita que los atacantes exploten el código inyectando código HTML o Javascript (ataques de secuencias de comandos entre sitios) en los formularios.


Gran nota sobre la seguridad de los formularios PHP

¡Los piratas informáticos pueden usar la variable $_SERVER["PHP_SELF"]!

Si se usa PHP_SELF en su página, entonces un usuario puede ingresar una barra inclinada (/) y luego algunos comandos de Cross Site Scripting (XSS) para ejecutar.

Cross-site scripting (XSS) es un tipo de vulnerabilidad de seguridad informática que normalmente se encuentra en las aplicaciones web. XSS permite a los atacantes inyectar secuencias de comandos del lado del cliente en las páginas web vistas por otros usuarios.

Supongamos que tenemos el siguiente formulario en una página llamada "test_form.php":

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Ahora, si un usuario ingresa la URL normal en la barra de direcciones como "http://www.example.com/test_form.php", el código anterior se traducirá a:

<form method="post" action="test_form.php">

Hasta ahora tan bueno.

Sin embargo, considere que un usuario ingresa la siguiente URL en la barra de direcciones:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

En este caso, el código anterior se traducirá a:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

Este código agrega una etiqueta de secuencia de comandos y un comando de alerta. Y cuando se cargue la página, se ejecutará el código JavaScript (el usuario verá un cuadro de alerta). Este es solo un ejemplo simple e inofensivo de cómo se puede explotar la variable PHP_SELF.

Tenga en cuenta que se puede agregar cualquier código JavaScript dentro de la etiqueta <script>. Un pirata informático puede redirigir al usuario a un archivo en otro servidor, y ese archivo puede contener un código malicioso que puede alterar las variables globales o enviar el formulario a otra dirección para guardar los datos del usuario, por ejemplo.


¿Cómo evitar los exploits de $_SERVER["PHP_SELF"]?

Las vulnerabilidades de $_SERVER["PHP_SELF"] pueden evitarse utilizando la función htmlspecialchars().

El código del formulario debería verse así:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

La función htmlspecialchars() convierte los caracteres especiales en entidades HTML. Ahora, si el usuario intenta explotar la variable PHP_SELF, dará como resultado el siguiente resultado:

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

¡El intento de explotación falla y no se produce ningún daño!


Validar datos de formulario con PHP

Lo primero que haremos será pasar todas las variables a través de la función htmlspecialchars() de PHP.

Cuando usamos la función htmlspecialchars(); luego, si un usuario intenta enviar lo siguiente en un campo de texto:

<script>ubicación.href('http://www.hacked.com')</script>

- esto no se ejecutaría, porque se guardaría como código HTML escapado, así:

<script>ubicación.href('http://www.hacked.com')</script>

Ahora es seguro mostrar el código en una página o dentro de un correo electrónico.

También haremos dos cosas más cuando el usuario envíe el formulario:

  1. Elimine los caracteres innecesarios (espacio adicional, tabulación, nueva línea) de los datos de entrada del usuario (con la función PHP trim())
  2. Elimine las barras invertidas (\) de los datos de entrada del usuario (con la función PHP stripslashes())

El siguiente paso es crear una función que haga todas las comprobaciones por nosotros (lo cual es mucho más conveniente que escribir el mismo código una y otra vez).

Nombraremos la función test_input().

Ahora, podemos verificar cada variable $_POST con la función test_input(), y el script se ve así:

Ejemplo

<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

Tenga en cuenta que al comienzo del script, verificamos si el formulario se envió utilizando $_SERVER["REQUEST_METHOD"]. Si REQUEST_METHOD es POST, entonces el formulario ha sido enviado y debe ser validado. Si no se ha enviado, omita la validación y muestre un formulario en blanco.

Sin embargo, en el ejemplo anterior, todos los campos de entrada son opcionales. El script funciona bien incluso si el usuario no ingresa ningún dato.

El siguiente paso es hacer que los campos de entrada sean obligatorios y crear mensajes de error si es necesario.