Seguridad en Desarrollo de sitios web con PHP y MySQL Seguridad en las aplicaciones web Seguridad en PHP Variables globales Nombres de ficheros Subida de ficheros Bibliotecas Formularios Inyección SQL
Seguridad en las aplicaciones web ¿Cuánta seguridad es necesaria? La seguridad supone un coste económico y de eficiencia. Hay que disponer de la adecuada, ni más ni menos Reglas: El riesgo cero no es práctico Hay diversas formas de mitigar el riesgo No se puede gastar un millón para proteger un céntimo
Seguridad en las aplicaciones web Amenazas más importantes: Top 10 The Open Web Application Security Project (OWASP)The Ten Most Critical Web Application Security Vulnerabilities (2007) http://www.owasp.org/documentation/topten Cross Site Scripting (XSS) Injection Flaws Malicious File Execution Insecure Direct Object Reference Cross Site Request Forgery (CSRF) Information Leakage and Improper Error Handling Broken Authentication and Session Management Insecure Cryptographic Storage Insecure Communications Failure to Restrict URL Access
Seguridad en las aplicaciones web Seguridad en el cliente Código móvil Seguridad en el servidor Servidor web, servidor de bases de datos, lenguajes de servidor Seguridad en la aplicación Control de acceso Validación de datos de entrada Programación segura Seguridad en la comunicación Certificados digitales, SSL
Seguridad en PHP Primera recomendación: Disponer siempre de versiones actualizadas de Apache y PHP Aspectos de PHP que pueden dar lugar a vulnerabilidades: Variables globales Nombres de ficheros Subida de ficheros Bibliotecas Datos enviados desde formularios
Variables globales Cuando register_globals está activado en el fichero php.ini, PHP crea automáticamente variables globales a partir de los datos de los formularios y de las cookies Esto puede dar lugar a problemas como en el ejemplo siguiente: < ?PHP if (comprueba_privilegios()) $superuser = true; … ?>
Variables globales Una llamada a este script de la forma pagina.php?superuser=1 permitiría obtener privilegios de superusuario Para resolver este problema existen tres soluciones: Deshabilitar register_globals en el fichero php.ini Inicializar las variables Establecer el orden de las variables en PHP
Variables globales Deshabilitar register_globals en el fichero php.ini La directiva register_globals del fichero php.ini establece si se admite o no la creación automática de variables globales A partir de PHP 4.2.0 el valor por defecto de esta directiva es off, que es el valor recomendable
Variables globales Inicializar las variables El problema anterior se soluciona dando un valor inicial a la variable $superuser: < ?PHP $superuser = false; if (comprueba_privilegios()) $superuser = true; … ?>
Variables globales Inicializar las variables Es recomendable inicializar todas las variables antes de usarlas. Se puede usar la directiva error_reporting=E_ALL en php.ini para que se muestre un aviso cuando se use una variable que no haya sido previamente inicializada En un entorno de producción debe evitarse la aparición de mensajes de aviso o error. Para ello se utilizan las siguientes directivas en php.ini: display_errors = off log_errors = on error_log = /var/log/php_errors.log Los errores irán al fichero especificado en lugar de mostrarse en la pantalla
Variables globales Establecer el orden de las variables en PHP PHP crea automáticamente variables globales a partir del entorno (E), las cookies (C), la información del servidor (S) y los parámetros GET (G) y POST (P) La directiva variables_order controla el orden de estas variables. El valor por defecto es EGPCS Permitir la creación de variables globales desde parámetros GET y POST y desde cookies es potencialmente peligroso. Un posible valor para variables_order que evita esto es ES En tal caso para acceder a los parámetros de los formularios y a las cookies se deben utilizar los arrays globales $_REQUEST, $_GET, $_POST y $_COOKIES
Variables globales Establecer el orden de las variables en PHP Si se modifican las directivas register_globals y/o variables_order es preciso revisar los scripts existentes para adaptarlos a las nuevas circunstancias Una forma puede ser la siguiente: $edad = $_REQUEST[edad]; …
Página siguiente |