Problemas principales en la Programación de Sistemas Web
Una gran parte de los problemas de seguridad en las aplicaciones web son causados por la falta de seguimiento por parte del programador en los siguientes aspectos:
- Entradas al sistema
- Salidas del sistema
Practicas básicas de Seguridad Web
Balancear Riesgo y Usabilidad
Si bien la usabilidad y la seguridad en una aplicación web no son necesariamente mutuamente excluyentes, algunas medidas tomadas para incrementar la seguridad con frecuencia afectan la usabilidad. Al igual que debemos pensar en las maneras en que usuarios ilegítimos nos pueden atacar, también debemos considerar la facilidad de uso para los usuarios legítimos.
La recomendación inicial sería tratar de usar medidas de seguridad que sean transparentes a los usuarios. Por ejemplo, la solicitud de un nombre de usuario y una contraseña para registrarse en un sistema son procedimientos esperados y lógicos por parte del usuario, con una matriz de acceso es un Modelo simple y preciso para describir, especificar los estados de protección de un sistema (SO, BD).
se deben identificar parámetros de inicio de sesión
– ID, certificado del otro, método de compresión,
especificación del cifrado, clave secreta maestra, se puede
reanudar.
• Parámetros de conexión:
– Calor aleatorio de cliente y servidor, servidor escribe
clave secreta MAC, cliente escribe clave secreta MAC,
cliente escribe clave, IV, número de secuencia.
Rastrear el paso de los Datos
La medida más importante como desarrollador preocupado por la seguridad que podemos tomar es mantener conocimiento de los pasos que ha recorrido la información en todo momento. Conocer de donde vinieron los datos y hacia donde van. En muchas ocasiones lograr esto puede ser complicado, especialmente sin un conocimiento profundo de como funcionan los sistemas Web.
En las aplicaciones web, existen maneras de distinguir los orígenes de los datos y poder así reconocer cuando los datos pueden ser dignos de confianza y cuando no. Ante todo, debemos recordar que la desesperación y la paranoia con mucha frecuencia nos dirigen a complicaciones y errores, usando una transición de estados de protección, y en la base de datos disparadores guardándolas en bitácoras.
El filtrado es una de las piedras angulares de la seguridad en aplicaciones web. Es el proceso por el cual se prueba la validez de los datos. Si nos aseguramos que los datos son filtrados apropiadamente al entrar, podemos eliminar el riesgo de que datos contaminados y que reciben confianza indebida sean usados para provocar funcionamientos no deseados en la aplicación.
El proceso de filtrado debe estar conformado por los siguientes pasos:
- Identificar la entrada.
- Filtrado de la entrada.
- Distinguir entre datos que ya han pasado por el filtro y los que no.
Por lo general, se considera más seguro tratar a los datos provenientes de bases de datos como entradas, aunque supuestamente sean bases seguras y en las que debiéramos tener confianza, esto se debe a que es mejor tener redundancia para evitar problemas en el caso de que la base de datos fuera vulnerada.
Existen además muchos puntos de vista diferentes sobre como realizar el filtrado o proceso de limpieza. Lo que usualmente se recomienda es ver al filtrado como un proceso de inspección, no debemos tratar de corregir los datos, es mejor forzar a los usuarios a jugar con las reglas válidas.
Otro aspecto a considerar en el proceso de filtrado es el uso de listas blancas, listas negras o una combinación de ambas.
Al usar listas blancas asumimos que los datos son inválidos a menos que prueben ser validos al encontrarse patrones coincidentes en la lista blanca. Una limitante de usar este punto de vista es considerar inválidos datos que debieron considerarse válidos pero que no fueron tomados en cuenta patrones similares al construir la lista blanca. Dentro de todo, cometer un error de este tipo es preferible que considerar válidos datos que no debieron considerarse así.
Una vez concluido el paso del filtrado solo resta usar convenciones apropiadas en el nombramiento de las variables para poder distinguir las que ya han sido filtradas. Una recomendación sería guardar las variables que ya hayan sido filtradas en un arreglo de fácil identificación (como $limpio), ademas requieriendo claves de cifrado y autentificación:
La captura de una clave no debe de dar acceso a todos los datos, solo a los datos protegidos por esa clave y claves no derivadas de sus predecesoras
Escapar salidas
Otra piedra angular de la seguridad en aplicaciones web es el proceso de escapado y su contraparte para codificar o decodificar caracteres especiales de tal forma que su significado original sea preservado.
El proceso de escapado debe estar compuesto a su vez por los siguientes pasos:
Identificar las salidas. Escapar las salidas. Distinguir entre datos escapados y noescapados.
Para escapar las salidas, primero debemos identificarlas. En PHP una forma de identificar salidas hacia el cliente es buscar por líneas como:
echo
print
printf
<?=
Además debemos considerar otro tipo de salidas como los datos que son enviados a otros sistemas como bases de datos, etc. El proceso de escapado debe adecuarse al tipo de salida de que se trate (si es al cliente, a la base de datos, etc.). Para la mayoría de los destinatarios, existen funciones nativas en PHP para esta finalidad.
La salida más común es el cliente, y para él existe en PHP la función htmlentities() que probablemente es la mejor función para escapar este tipo de salidas. Una recomendación adicional con respecto esta función es especificar los parámetros opcionales apropiados con la codificación de carácter empleada en la cabecera de la aplicación (Content-Type).
Para distinguir entre los datos que han sido escapados de los que no es recomendable también usar una convención de nombres. Para el caso de contenido escapado con la función htmlentities() se puede usar un arreglo en especial al que podríamos llamar $html.
Otro destinatario común son las bases de datos, sin embargo cada tipo de manejador (MySQL, PostgreSQL, etc.) puede presentar sus detalles, por lo que es necesario una función de escapado apropiada para cada caso. Para los usuarios de MySQL, la función recomendada es mysql_real_escape_string().
Referencias de Internet: