Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cuando el cliente emite una solicitud, el componente del lado del servidor debe
verificar la existencia y validez del token en la solicitud en comparación con el
token encontrado en la sesión del usuario. Si el token no se encontró dentro
de la solicitud, o el valor proporcionado no coincide con el valor dentro de la
sesión del usuario, entonces la solicitud debe ser cancelada, la sesión del
usuario finalizada y el evento registrado como un posible ataque CSRF en
progreso.
Los tokens CSRF deben ser:
Único por sesión de usuario.
Secreto
Impredecible (gran valor aleatorio generado por un método seguro ).
Los tokens CSRF evitan CSRF porque sin el token, el atacante no puede crear
solicitudes válidas para el servidor de fondo.
Por ejemplo:
<form action="/transfer.do" method="post">
<input type="hidden" name="CSRFToken"
value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1
ZDZMGYwMGEwOA==">
[...]
</form>
Insertar el token CSRF en el encabezado de solicitud HTTP personalizado a
través de JavaScript se considera más seguro que agregar el token en el
parámetro de formulario de campo oculto porque usa encabezados de solicitud
personalizados .
1. Utiliza una función HMAC fuerte (se recomienda SHA-256 o superior) en lugar de una
función de cifrado para generar el token.
2. El token consiste en un HMAC y una marca de tiempo.
1. Determinar el origen del que proviene la solicitud (origen de origen). Se puede hacer
a través de encabezados Origin o Referer.
2. Determinar el origen al que va la solicitud (origen de destino).
En ambos casos, asegúrese de que la verificación del origen del objetivo sea
sólida. Por ejemplo, si su sitio
está example.orgseguro example.org.attacker.com, no pase su verificación de
origen (es decir, haga coincidir el origen / después del origen para asegurarse
de que coincida con el origen completo).
Si ninguno de estos encabezados está presente, puede aceptar o bloquear la
solicitud. Recomendamos el bloqueo . Alternativamente, es posible que
desee registrar todas esas instancias, monitorear sus casos de uso /
comportamiento y luego comenzar a bloquear las solicitudes solo después de
obtener suficiente confianza.
Por lo general, un porcentaje menor del tráfico cae dentro de las categorías
anteriores ( 1-2% ) y ninguna empresa querría perder este tráfico. Una de las
técnicas populares utilizadas en Internet para hacer que esta técnica sea más
útil es aceptar la solicitud si el origen / referencia coincide con su lista
configurada de dominios "O" un valor nulo (ejemplos aquí . El valor nulo es
para cubrir los casos límite mencionados anteriormente donde estos
encabezados no se envían). Tenga en cuenta que los atacantes pueden
explotar esto, pero las personas prefieren usar esta técnica como una medida
de defensa en profundidad debido al menor esfuerzo que implica desplegarla.
Una alternativa más simple a una cookie encriptada es mezclar el token con
una sal secreta conocida solo por el servidor y colocar este valor en una
cookie. Esto es similar a una cookie encriptada (ambas requieren
conocimiento que solo el servidor posee), pero es menos computacionalmente
intensivo que encriptar y desencriptar la cookie. Ya sea que se use cifrado o
un hash salado, un atacante no podrá recrear el valor de la cookie desde el
token simple sin conocer los secretos del servidor.
Cookie con prefijo __Host-
Otra solución para este problema es el uso de Cookie Prefixescookies con
token CSRF. Si la cookie tiene un __Host-prefijo, por ejemplo Set-Cookie:
__Host-token=RANDOM; path=/; Secure, la cookie:
Si bien se trata de una defensa CSRF muy fuerte, puede crear un impacto
significativo en la experiencia del usuario. Como tal, generalmente solo se
usarían para operaciones críticas de seguridad (como cambio de contraseña,
transferencias de dinero, etc.), junto con las otras defensas discutidas en esta
hoja de trucos.
Por ejemplo, si un atacante usa CSRF para autenticar a una víctima en un sitio
web de compras utilizando la cuenta del atacante, y luego la víctima ingresa la
información de su tarjeta de crédito, un atacante puede comprar artículos
usando los datos de la tarjeta almacenados de la víctima. Para obtener más
información sobre el inicio de sesión CSRF y otros riesgos, consulte la sección
3 de este documento.
Tenga en cuenta que solo actúa como una muestra de referencia y no está
completa (por ejemplo: no tiene un bloque para dirigir el flujo de control cuando
la verificación de origen y encabezado de referencia tiene éxito ni tiene una
validación de nivel de puerto / host / protocolo para el encabezado de
referencia ) Se recomienda a los desarrolladores que creen su mitigación
completa sobre esta muestra de referencia. Los desarrolladores también
deben implementar comprobaciones de autenticación o autorización estándar
antes de verificar CSRF.
Los métodos POST , PUT , PATCH y DELETE , que son verbos que cambian
de estado, deben tener un token CSRF adjunto a la solicitud. La siguiente guía
demostrará cómo crear anulaciones en las bibliotecas de JavaScript para que
los tokens CSRF se incluyan automáticamente con cada solicitud de AJAX
para los métodos de cambio de estado mencionados anteriormente.
AngularJS
AngularJS permite configurar encabezados predeterminados para
operaciones HTTP. Puede encontrar más documentación en la documentación
de AngularJS para $ httpProvider .
<script>
var csrf_token = document.querySelector("meta[name='csrf-
token']").getAttribute("content");
Axios
Axios nos permite establecer encabezados predeterminados para las acciones
POST, PUT, DELETE y PATCH.
<script type="text/javascript">
var csrf_token = document.querySelector("meta[name='csrf-
token']").getAttribute("content");
axios.defaults.headers.post['anti-csrf-token'] = csrf_token;
axios.defaults.headers.put['anti-csrf-token'] = csrf_token;
axios.defaults.headers.delete['anti-csrf-token'] = csrf_token;
axios.defaults.headers.patch['anti-csrf-token'] = csrf_token;
// Axios does not create an object for TRACE method by default, and has
to be created manually.
axios.defaults.headers.trace = {}
axios.defaults.headers.trace['anti-csrf-token'] = csrf_token
</script>
Este fragmento de código ha sido probado con Axios versión 0.18.0.
JQuery
JQuery expone una API llamada $ .ajaxSetup () que se puede usar para
agregar el anti-csrf-tokenencabezado a la solicitud AJAX. La documentación
de la API $.ajaxSetup()se puede encontrar aquí. La
función csrfSafeMethod()definida a continuación filtrará los métodos HTTP
seguros y solo agregará el encabezado a los métodos HTTP inseguros.
Puede configurar JQuery para agregar automáticamente el token a todos los
encabezados de solicitud adoptando el siguiente fragmento de código. Esto
proporciona una protección CSRF simple y conveniente para sus aplicaciones
basadas en AJAX:
<script type="text/javascript">
var csrf_token = $('meta[name="csrf-token"]').attr('content');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("anti-csrf-token", csrf_token);
}
}
});
</script>
Este fragmento de código ha sido probado con jQuery versión 3.3.1.
Referencias
CSRF
OWASP Falsificación de solicitudes entre sitios (CSRF) PortSwigger Web
Security Academy Mozilla Web Security Cheat Sheet Conceptos erróneos
comunes de prevención de CSRF Defensas sólidas para falsificaciones de
solicitudes entre sitios