Al principio de la guía dijimos que el filtrado de datos es la piedra angular de la seguridad de las aplicaciones WEB en cualquier idioma y en cualquier plataforma. Esto incluye verificar la entrada de datos hacia y desde la aplicación, y un buen diseño de software puede ayudar a los desarrolladores:
garantizar que no se pueda eludir el filtrado de datos,
garantizar que la información ilegal no afecte la información legal e
identificar la fuente de los datos.
Hay varias opiniones sobre cómo garantizar que no se pueda eludir el filtrado de datos, y dos de ellas son más generales que otras y proporcionan un mayor nivel de seguridad.
Método de programación Este método se programa con un único script PHP (a través de URL). Cualquier otra operación se incluye utilizando include o require cuando sea necesario. Este enfoque generalmente requiere que a cada URL se le pase una variable GET separada para su envío. Esta variable GET puede considerarse como un diseño más simplificado que reemplaza el nombre del script. Por ejemplo:
http://example.org/dispatch.php?task=print_formdispatch.php es el único archivo raíz (raíz del documento). Permite a los desarrolladores hacer dos cosas muy importantes:
implementar algún procesamiento de seguridad global en despacho.php al principio y garantizar que este procesamiento no se pueda omitir.
Es fácil determinar dónde es necesario el filtrado de datos, especialmente para algunas operaciones de flujo de control con fines especiales.
Consulte el siguiente ejemplo para obtener más información sobre el script Dispatch.php:
<?php/* Global Security Handling*/switch ($_GET['task']){case 'print_form':include '/inc/presentation/form.inc '; break;case 'process_form':$form_valid = false;include '/inc/logic/process.inc';if ($form_valid){include '/inc/presentation/end.inc';}else{include '/ inc/presentation/form.inc';}break;default:include '/inc/presentation/index.inc';break;}?>Si este es el único script PHP de acceso público, puede estar seguro de que este programa El diseño garantiza que no se pueda eludir el procesamiento de seguridad global inicial. También facilita a los desarrolladores ver el flujo de control de tareas específicas. Por ejemplo, es fácil saberlo sin explorar el código completo: cuando $form_valid es verdadero, end.inc es el único que se muestra al usuario, ya que es antes de que se incluya proceso.inc y acaba de inicializarse en falso; se puede determinar que la lógica interna de Process.inc lo establecerá en verdadero; de lo contrario, el formulario se mostrará nuevamente (posiblemente con un mensaje de error asociado).
Tenga en cuenta que si utiliza un archivo de directiva de directorio como index.php (en lugar de despacho.php), puede utilizar la dirección URL como esta: http://example.org/?task=print_form .
También puede utilizar la redirección ApacheForceType o mod_rewrite para ajustar la dirección URL: http://example.org/app/print-form .
Otra forma de incluir métodos es utilizar un único módulo que sea responsable de todo el manejo de la seguridad. Este módulo se incluye al principio (o al principio) de todos los scripts PHP públicos. Consulte el siguiente script security.inc
<?phpswitch ($_POST['form']){case 'login':$allowed = array();$allowed[] = 'form';$allowed[] = 'nombre de usuario' ; $allowed[] = 'contraseña';$sent = array_keys($_POST);if ($allowed == $sent){include '/inc/logic/process.inc';}break;}?>En este caso , se considera que cada formulario enviado contiene el valor de verificación único del formulario, y security.inc procesa de forma independiente los datos en el formulario que deben filtrarse. El formulario HTML que implementa este requisito es el siguiente:
<form action="/receive.php" método="POST"><input type="hidden" name="form" value="login" /><p>Nombre de usuario : <tipo de entrada="texto" nombre="nombre de usuario" /></p><p>Contraseña:<tipo de entrada="contraseña" nombre="contraseña" /></p><tipo de entrada="enviar" / > </form>Se utiliza una matriz llamada $allowed para comprobar qué variables del formulario están permitidas. Esta lista debe ser coherente antes de procesar el formulario. El control de procesos decide qué ejecutar y Process.inc es donde llegan los datos filtrados reales.
Tenga en cuenta que una mejor manera de garantizar que security.inc siempre se incluya al principio de cada secuencia de comandos es utilizar la configuración auto_prepend_file.
Ejemplo de filtrado Crear una lista blanca es muy importante para el filtrado de datos. Dado que es imposible dar ejemplos para cada dato de formulario que pueda encontrar, algunos ejemplos pueden ayudarle a obtener una comprensión general.
El siguiente código valida la dirección de correo electrónico:
<?php$clean = array();$email_pattern = '/^[^@s<&>]+@([-a-z0-9]+.) +[ az]{2,}$/i';if (preg_match($email_pattern, $_POST['email'])){$clean['email'] = $_POST['email'];}?> debajo del código asegura que el contenido de $_POST['color'] sea rojo, verde o azul:
<?php$clean = array();switch ($_POST['color']){case 'red':case 'green ' :case 'blue':$clean['color'] = $_POST['color'];break;}?>El siguiente código garantiza que $_POST['num'] sea un número entero:
<?php$ clean = array ();if ($_POST['num'] == strval(intval($_POST['num']))){$clean['num'] = $_POST['num'];} >¿Lo siguiente? El código garantiza que $_POST['num'] es un flotante:
<?php$clean = array();if ($_POST['num'] == strval(floatval($_POST['num ']))){ $clean['num'] = $_POST['num'];}?> Cada ejemplo utiliza la matriz $clean antes de la conversión de nombre. Esta es una buena práctica para que los desarrolladores determinen si sus datos están potencialmente comprometidos. Nunca guarde datos en $_POST o $_GET después de validarlos. Como desarrollador, siempre debe desconfiar de los datos guardados en matrices súper globales.
Cabe agregar que usar $clean puede ayudar a pensar en lo que no se ha filtrado, lo cual es más similar al rol de una lista blanca. Puede mejorar el nivel de seguridad.
Si solo almacena datos validados en $clean, el único riesgo en la validación de datos es que el elemento de matriz al que hace referencia no exista, no datos peligrosos sin filtrar.
Sincronización Una vez que el script PHP comienza a ejecutarse, significa que todas las solicitudes HTTP han finalizado. En este punto, el usuario no tiene posibilidad de enviar datos al script. Por lo tanto, no se pueden ingresar datos en el script (incluso si Register_globals está activado). Es por eso que inicializar variables es una muy buena práctica.