Nos puede interesar aplicar ciertas medidas de seguridad a nuestro servidor web con PHP. Como todos sabemos las configuraciones se hacen en el archivo php.ini . Si somos el administrador del servidor podremos configurar estas medidas, en algunos hostings compartidos con CPanel hay una opción que permite hacer esto. Si no es así, entonces tendremos que ponernos en contacto con el administrador del servidor y proponerle estas medidas.
Procedemos a editar el archivo php.ini. Las siguientes directivas se recomienda reconfigurarlas:
- max_execution_time=30 ;Tiempo máximo de ejecución
- max_input_time=60 ;Tiempo máximo de espera para recibir datos de un formulario o cualquier input
- memory_limit=8M ; Máximo de memoria que puede ejecutar una aplicación
Para ver las configuraciones del servidor podemos usar phpinfo()
<?php
phpinfo()
?>
Esta función muestra la configuración del servidor.
Habilitar el reporte de errores
Cuando escribimos alguna aplicación es fácil que se nos olvide el nombre de alguna variable o usemos alguna función deprecated. Por ejemplo, PHP nos permite usar una variable sin declaración previa, por eso nos podemos confundir al escribir el nombre de la variable y que nuestra aplicación falle.
Para intentar solucionar estos errores humanos podemos habilitar el reporte de errores en nuestros scripts. Para esto solo tenemos que agregar la función error_reporting(E_ALL); al principio de nuestras aplicaciones:
<?php
error_reporting(E_ALL);
//Aqui va el resto de codigo, funciones, clases y demás ...
?>
Uno de los mensajes que podemos recibir es:
Notice: Undefined variable: var in script.php on line n
Esto nos advierte que estamos usando una variable que no esta instanciada, puede ser por que la hemos escrito mal.
Deshabilitar el reporte de errores general
Nos puede pasar que tengamos una aplicación que funcione correctamente pero PHP nos siga advirtiendo de algún "posible fallo". Los errores también facilitan muchísimo la labor a un posible atacante. Editamos el fichero de configuracion de PHP, php.ini y cambiamos la linea:
display_errors=Off ;Deshabilita el reporte general de errores
Después de hacer cualquier cambio en el servidor, para que los cambios surjan efecto hay que reiniciar el servicio.
Si nos interesa ver esos errores pero sin que los vean los visitantes podemos habilitar el log de errores. En php.ini buscamos la linea:
log_errors=On
Podemos incluso enviar los errores al syslog. En el archivo de configuración tenemos algunos ejemplos.
Otros ajustes
Podemos ajustar el tamaño de los archivos que se pueden enviar al servidor:
upload_max_filesize=8M ;Suele ser mas que suficiente
Tambien nos conviene cambiar el directorio donde se guardan los ficheros temporales:
upload_tmp_dir=\var\tmp\tmp2"
Creo que ya no hace falta decir que debemos desactivar los register_globals.
register_globals=Off
A partir de PHP 4.2 esta opción viene desactivada por defecto.
Para prevenir posibles ataques de inyeccion SQL podemos activar los Magic Quotes aunque se recomienda usar la función mysql_real_escape_string(), pero si nos ponemos cabezotas podemos usar Magic Quotes. Buscamos la linea:
magic_quotes_gpc=1
Podemos denegarle el acceso a PHP a directorios que no esten a su alcance. Por ejemplo que no se puedan leer ni manipular archivos que no estén en la carpeta www:
open_basedir=/home/www
Podemos agregar mas concatenando varias rutas separadas por : (en Unix) o ; (en Windows).
Prohibir el uso de ciertas funciones
Supongamos que por razones obvias de seguridad decidimos prohibir el uso de funciones como exec() que permite ejecutar comandos directamente en el servidor. Para esto buscamos la siguiente linea y agregamos las funciones que queremos prohibir:
disable_functions=system, exec, passthru, shell_exec, proc_open
Extensiones para mejorar el uso y la seguridad
Nos puede mejorar el desarrollo y uso de aplicaciones habilitando mas extensiones en el servidor.
cURL=permite al servidor PHP enviar y recibir informacion de otros sitios/webs.
Mcrypt=Sirve para cifrar todo tipo de variables, tanto de sesión y cookies como números de tarjetas bancarias.
GD=Usada para crear gráficos, trabajar con imágenes en formato jpeg y gif o también crearlas.