Mecanismo anti-CSRF con encabezado de referencia

3

Este no es mi principal mecanismo anti-CSRF; Sé que las solicitudes https no tienen un encabezado de referencia; Sé que los usuarios o los cortafuegos pueden eliminarlo o establecerlo en un valor fijo arbitrario.

Pretendo este mecanismo solo como una posible capa de seguridad agregada que previene CSRF en caso de que mi mecanismo principal sea ignorado por alguna razón.

Mi código será algo como esto:

if(isset($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']))
if(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)!=$_SERVER['HTTP_HOST'])
exit('Anti-CSRF mechanism!');

Creo que esto no tiene problemas de soporte y usabilidad. ¿verdad?

    
pregunta H M 23.03.2013 - 17:42
fuente

2 respuestas

7

Aunque está revisando el el encabezado del referenciador HTTP es un método para mitigar el CSRF , esta implementación de PHP propuesta se omite al omitir el remitente, lo que se puede hacer usando una política de meterferenciador . Si el exploit CSRF se origina en un sitio HTTPS, entonces el remitente estará ausente, y este caso ausente no se verifica en el código anterior. La falta de un referente debe considerarse un ataque. Sin embargo, un método anti-csrf mucho mejor es usar un token de sincronización.

    
respondido por el rook 23.03.2013 - 18:14
fuente
0

Hay formas de perder las mitigaciones de CSRF usando Referer en HTTP. Se puede acceder a la demostración práctica aquí: enlace

Cotización de omisiones desde el enlace anterior:

  

Bypasses: GET peticiones

data: with location= - Chrome / Safari
window.open() - MSIE
data: with meta refresh - Firefox / Opera / Chrome / Safari 
     

Solicitudes POST

data: with meta refresh & form submit - Firefox / Chrome / Safari

Una mejor opción podría ser Origin o NoRefferer .

    
respondido por el Shritam Bhowmick 29.10.2015 - 12:25
fuente

Lea otras preguntas en las etiquetas