Principios generales de seguridad

Algunos tips

Reducir los privilegios. Si una función es accedida sólo dentro de una clase, no necesita poder ser accedida desde fuera y podemos hacerla privada.

Lo simple es más seguro. Cuanto más grande y complejo sea un sistema, más complicado será añadirle seguridad.

Nunca confíes en los usuarios. Cualquiera con un ordenador puede ser un hacker.

Mantén tu código actualizado.

index.php

Este es el fichero que buscará el servidor cuando alguien especifica que quiere acceder mediante el navegador a un directorio, pero no a un archivo. Si no tenemos un fichero index.php incluido en el directorio, es posible que el directorio devuelva la lista de archivos que hay en él, lo cual es un problema de seguridad.

phpinfo() y phpmyadmin

No nos interesa que ninguno de los dos esté presente en nuestro servidor de producción.

Si debemos tener el phpmyadmin en producción, habrá que proteger su acceso mediante password. Una opción puede ser usar el fichero .htaccess para protegerlo, además de la autentificación HTTP que ofrece phpmyadmin.

Para más info:
http://docs.phpmyadmin.net/en/latest/setup.html#securing-your-phpmyadmin-installation

Login

Cuando un usuario falla al tratar de loguerase no deberíamos de indicarlo si ha fallado en el usuario o en la password, porque de lo contrario tendrá la mitad de lo que necesita para acceder a la página.

En el registro, encriptaremos la password y la almacenaremos encriptada en la base de datos.

Luego, en el login, comprobaremos si la password introducido, una vez encriptada, coincide con la que está almacenada en la base de datos.

Magic Quotes

Utiles para prevenir inyección SQL.

Cuando lo activamos, PHP escapa todo lo enviado en peticiones GET, POST y COOKIE.
Es mejor que aprendamos a escapar nosotros mismos esta información y que aprendamos a gestionar inyección SQL por nosotros mismos.

Traían consigo varios problemas que hicieron que se eliminase su uso a partir de PHP 5.4.

Para deshabilitarlo, en el php.ini:

	
magic_quotes_gpc = Off
magic_quotes_runtime = Off
	

Register Globals (eliminado en PHP 5.4)

PHP version < 4.2 → On by default
PHP Version 4.2 >= → Off by default

http://somesite.com/page=1&query=hello
	
<?php echo $page; ?>
<?php echo $query; ?>
	
http://somesite.com/logged_in=true
	
<?php
	if(check_password($username, $password)){
		$logged_in = true;
	}
	if($logged_in){
		//display the page
	}
?>
	

Para evitar este problema debemos tener register_globals en off, o inicializar todas las variables y tener la configurar la gestión de errores para que se nos avise de las variables no inicializadas.

Principios generales de seguridad 1

Error reporting lo configuramos en el php.ini (/etc/php5/apache2 )

  • error_reporting: determina que errores se mostrarán.
  • display_errors: dónde se mostrarán dichos errores
  • log_errors: determina si hay o no log de errores.
  • error_log: el path el log de errores.

Tipos de errores

  • E_ERROR (fatal errors, detienen la ejecución de la página)
  • E_WARNING (non-fatal errors, errores importantes pero que no detienen la ejecución de la página)
  • E_NOTICE (posible error)
  • E_STRICT (>5.0 sugerencias de mejora)
  • E_DEPRECATED (>5.3 el código usado dejará de funcionar en el futuro)
  • E_ALL (todos los errores)
  • http://php.net/manual/en/errorfunc.constants.php

Development error_reporting

< 5.0: error_reporting = E_ALL

5.0 – 5.4: error_reporting = E_ALL | E_STRICT
(Las sugerencias de mejora no fueron incluidas por defecto en la visualización de todos los errores (E_ALL) y debemos incluirla manualmente)

> 5.4: error_reporting = E_ALL

Development y Production

Development: display_errors = on log_errors = off error_log = ”

Production: display_errors = off log_errors = on error_log = /private/path/to/errors.log #error_log = syslog → pone los logs dónde le correponda en función del SO

Aviso Legal | Política de privacidad