Estoy escribiendo un nuevo sitio web en PHP y usaré cookies para rastrear los datos de las sesiones de los usuarios. Antes de finalizar el diseño, quiero asegurarme de que el sitio no sea vulnerable a los ataques. He escrito una lista de métodos de ataque y se me ocurrieron contramedidas para cada uno. ¿Alguien puede pensar en más métodos de ataque y, si es así, proponer medidas adecuadas?
Una lista de todos los métodos de ataque que podría pensar:
- cookie de sesión de Guess / bruteforce
- Robar cookie de sesión (por ejemplo, si el atacante guarda la cookie de sesión en USB)
- secuencias de comandos entre sitios
- Phishing (fijación de sesión)
- inyección SQL
- inyección de encabezado HTTP
Se debe tener en cuenta que usaré mi propia base de datos para almacenar información de la sesión, no las funciones de sesión estándar de PHP. Cuando detecto un ataque, ejecutaré una función llamada warn_and_halt()
que registrará el ataque e informará al administrador del sistema, luego detendrá la sesión bajo ataque.
Mis contramedidas para cada uno de los tipos de ataques anteriores son:
-
En lugar de usar un entero grande para el ID de sesión almacenado en la cookie, generaré mi propio número aleatorio y luego lo haré con algo como SHA-1 para que sea más difícil de adivinar. Por supuesto, el ID de sesión puede no ser único si se crea de esta manera, así que tendré que revisar todos los otros ID de sesión en la base de datos y regenerar si el ID de sesión recién generado ya existe. Estoy seguro de esta medida.
-
Estoy asumiendo que el USB se llevará a otra computadora y que la cookie de la sesión se cargará en otro navegador. Registraré el agente de usuario (nombre del navegador) para cada sesión. Si el agente de usuario cambia durante la sesión, entonces
warn_and_halt()
. He leído acerca de personas que utilizan la dirección IP para validar el ID de la sesión, pero no creo que vaya a usar esto en absoluto, ya que las direcciones IP pueden cambiar durante una sesión por razones completamente inocentes, por ejemplo, si el enrutador del usuario se reinicia y negocia Una nueva IP con su ISP. ¿Alguien puede sugerir más contramedidas aquí? -
Estableceré la cookie de sesión como HTTPonly y también comprobaré el dominio de las cookies entrantes. No hay mucho de lo que se puede hacer para evitar que eso suceda en un navegador, en mi opinión, el navegador puede optar por no cumplir con la bandera de HTTP, ¡nada de lo que puedo hacer allí! ¿Alguien sabe una mejor manera de prevenir el XSS?
-
Me imagino que el phishing se producirá cuando el usuario inicie sesión incorrectamente en mi sitio y luego envíe un enlace como
<a href='javascript:void(0);' onclick="document.cookie='sessionid=xxxx';document.location='http://mywebsite/'">
al usuario "inconsciente". Esto establecerá una cookie de sesión sin que "ajeno" lo sepa. Luego, "ajeno" ingresará su información personal y el usuario "malo" tendrá esta información. Creo que la mayoría de los navegadores no permitirán que el dominio de la nueva cookie se establezca como mywebsite, por lo que "ajeno" es bastante seguro. Sin embargo, verificaré el dominio entrante de cada cookie para asegurarme de que sea para mi sitio web. Definitivamente usaré cookies, en lugar de GET o POST para almacenar el ID de sesión. Además, contrarrestaré la fijación de sesión cambiando el ID de sesión para cada página visitada. -
La inyección de SQL es un problema con un alcance mucho mayor que el robo de ID de sesión, pero en general lo contrarrestaré, siempre evitando los datos entrantes (incluidas las cookies) y filtrando los caracteres incorrectos con expresiones regulares. Creo que tengo este muy bien cubierto.
-
Acabo de enterarme de la inyección del encabezado HTTP. Sin embargo, parece bastante fácil contrarrestar, simplemente evite los campos de encabezado entrantes, especialmente para los retornos de transporte y valide los encabezados entrantes.
Así que esos son todos los ataques y contramedidas que podría pensar (después de un poco de lectura en línea). Si ve alguno que haya perdido, por favor responda. Si ve que alguna de mis contramedidas es insuficiente, por favor dígalo.