Medidas de Seguridad en un Servidor Web con PHP [Tips]

Iniciado por madpitbull_99, 1 Enero 2011, 17:22 PM

0 Miembros y 1 Visitante están viendo este tema.

madpitbull_99

He hecho un pequeño articulo sobre algunas medidas que deberíamos tomar en cuenta a la hora de instalar o configurar un servidor PHP. Claro que si nos ponemos en modo paranoico acabamos desactivando la mitad de las funciones y características del servidor.

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
El punto y coma (;) podemos dejarlo ya que indica un comentario y no sera tomado en cuenta por el servidor web. Es importante comentar las lineas y los cambios hechos en cualquier servidor.

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.



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

~ Yoya ~

Se recomienda dejar las magic_quotes_gpc Off, ya que es recomendable filtrar los datos a la salida y no a la entrada, pero en el caso de manejar peticiones SQL que reciben datos vía GET o POST incluso vía COOKIE es necesario filtrar la entrada de datos. También nos filtrara el contenido de todos los datos que viajen vía POST, GET y COOKIE que en la mayoría de los casos no son utilizado para realizar peticiones SQL y quizás a la larga sea un problemita.

Seria bueno ir recopilando información y modificando este POST.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Nakp

yo agregaria... no usar $_REQUEST ya que se pierde el control de por donde se toman los datos :) es demasiada flexibilidad para un sistema, es algo que noto muy seguido en este foro, el abuso del $_REQUEST
Ojo por ojo, y el mundo acabará ciego.