Balancear riesgo y usabilidad
Si
bien la usabilidad y la seguridad en una aplicación web no son
excluyentes una de la otra, alguna medida tomada para incrementar la
seguridad con frecuencia afecta la usabilidad. Normalmente siempre se
debe pensar en las maneras en que usuarios ilegítimos nos pueden atacar y
la facilidad de uso para los usuarios legítimos.
Es
conveniente emplear medidas de seguridad que sean transparentes a los
usuarios y que no resulten engorrosas en su empleo. Por ejemplo, el uso
de un login que solicita el nombre de usuario y contraseña, permite
controlar el acceso de los usuarios hacia secciones restringidas de la
aplicación. Este paso adicional, es una característica que impacta en la
rapidez de acceso a la información por parte del usuario, pero que
proporciona un elemento adicional de protección.
A
mayor complejidad de nuestro sitio, aumenta el riesgo de que se sufra
un ataque debido a sus características más elaboradas, es por eso que
deben considerarse opciones de seguridad necesarias y sencillas pero
eficientes, que ayuden a mitigar cualquier característica que la haga
vulnerable.
Rastrear el paso de los datos:
Es
muy importante mantener conocimiento de los pasos que ha recorrido la
información en todo momento. Conocer de dónde vienen los datos y hacia
dónde van. En muchas ocasiones lograr esto puede ser complicado,
especialmente sin un conocimiento profundo de cómo funcionan las
aplicaciones 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.
Normalmente
existen arreglos globales en la aplicación (por ejemplo en PHP los
arreglos $_GET, $_POST, $_COOKIE y $_SESSION entre otros) que sirven
para identificar de forma clara las entradas proporcionadas por el
usuario. Si esto lo combinamos con una convención estricta para el
nombrado de las variables podemos tener un control sobre el origen de
los datos usados en el código.
Además
de entender los orígenes de la información se debe dar la misma
importancia a entender cuáles son las salidas que tiene la aplicación y
hacia a donde se devuelven los resultados.
Filtrar entradas
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 sean usados
para provocar funcionamientos no deseados en la aplicación.
Existen
muchos puntos de vista diferentes sobre cómo 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.
Al
usar listas blancas asumimos que los datos son inválidos a menos que
prueben ser validos al encontrarse patrones coincidentes. 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.
Si
llegamos a utilizar algún framework se debe tener especial cuidado, ya
que estos brindan tantas comodidades que muchos desarrolladores
inexpertos los utilizan sin preocuparse en entender el código que están
observando y por lo tanto implementan medidas de validación en entradas,
variables, entre otros, sin entender exactamente el funcionamiento de
la solución empleada.
Es
importante notar que en los lenguajes de programación existen una buena
cantidad de filtros pero evidentemente estos no llegan a cubrir todas
las necesidades que puede tener un desarrollador. En este caso, se
llegan a utilizar funciones creadas y adaptadas a nuestras necesidades a
modo de filtro especial, en la mayoría de estos casos es donde se puede
encontrar el uso de expresiones regulares.
Tenemos
un ejemplo en PHP de variables GET sanitizadas mediante una función la
cual valida que únicamente sean números enteros
(FILTER_SANITAZE_NUMBER_INT) y no contengan etiquetas HTML (strip_tags).
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.
Escapado de salidas
Otro
punto importante de la seguridad es el proceso de escapado y su
contraparte para codificar o decodificar caracteres especiales de tal
forma que su significado original sea preservado. Si llegamos a utilizar
una codificación en particular es necesario conocer los caracteres
reservados los cuales serán necesarios escapar.
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 no escapados.
· El
proceso de escapado debe adecuarse al tipo de salida de que se trate
(si es al cliente, a la base de datos, etcétera). Para la mayoría de los
destinatarios, existen funciones nativas en los lenguajes de
programación para esta finalidad. En alguno de los casos como podría ser
el de base de datos es importante incluso observar la codificación en
la que son enviados.
Para
distinguir entre los datos que han sido escapados de los que no, es
recomendable también usar una convención de nombres. Es necesario una
función de escapado para cada caso, como ejemplo en PHP se tomarían las
siguientes consideraciones para:
Correo electrónico, se puede usar la función filter_var() con los argumentos de FILTER_VALIDATE_EMAIL.
Bases de datos SQL, es más recomendable utilizar consultas parametrizadas, pero podríamos utilizar mysql_real_escape_string.
Líneas de comandos, se puede hacer uso de la función escapeshellarg().
Código
en Javascript, PHP no tiene un método incorporado para escaparlo, pero
se puede utilizar json_encode() junto con htmlspecialchars() si se
quiere mostrar en HTML.
No hay comentarios:
Publicar un comentario