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 |