¿De qué está protegiendo la session.referer_check de PHP?
security cakephp (3)
Tenga en cuenta que básicamente todo lo que referer_check está haciendo es algo así como:
$pattern = "/^http:////www/.myurl/.com(//.*)*$/";
if(!empty($_SERVER[''HTTP_REFERER'']) && !preg_match($pattern, $_SERVER[''HTTP_REFERER''])) {
session_destroy();
}
Es molesto que los PHPs incorporados en referer_check
no acepten un conjunto de URL, pero siempre puedes hacer tu propio que sí lo haga.
Entonces, para CakePHP, podrías hacer algo como lo siguiente:
// ADD THIS TO /app/config/config.php
$config[''CustomSecurity''] = array(
''accept_referers'' => array(
''http://www.my_site.com'',
''https://www.other_allowed_referer.com'',
)
);
// ADD THIS TO /app/app_controller.php
private function referer_check(){
if(!empty($_SERVER[''HTTP_REFERER''])) {
$accept_referers = Configure::read(''CustomSecurity.accept_referers'');
$referer_accepted = false;
foreach($accept_referers as $referer) {
$pattern = ''/^''.preg_replace(''/(/.|//)/'',''///$1'',$referer).''(//.*)*$/'';
if(preg_match($pattern, $_SERVER[''HTTP_REFERER'']))
$referer_accepted = true;
}
if(!$referer_accepted) {
$this->Session->destroy();
exit;
}
}
}
Y EN SU app_controller::before_filter
FUNCTION, LLAME A:
$this->referer_check();
... o algo así de todos modos ... disculpa por el formato del código, el área de texto estaba siendo un tard :)
Estoy creando un sistema con CakePHP que necesita ser decentemente seguro, porque estamos lidiando con dinero, cuentas de clientes, etc. Hasta ahora todo ha estado funcionando bien, hasta que tuve que integrarme con una plataforma de pagos en la que necesitaba para redirigir a su sitio y redirigen a la mía.
Esto funciona bien en mi máquina de desarrollo (depuración = 2), pero en la producción, cuando se redirige al cliente, recibe un aviso de inicio de sesión en lugar de regresar a su "área de inicio de sesión". Después de excavar, descubrí que esto se debe a que CakePHP establece session.referer_check, lo que invalida las sesiones si el HTTP_REFERER proviene de otro servidor que no sea el mío.
Ahora, normalmente, inhabilito esto sin pensarlo dos veces, pero en este sistema estoy un poco más preocupado por la seguridad de lo normal.
Mi pregunta es ¿de qué se supone que session.referer_check me protege?
¿Qué tipo de ataque / ataque / malo se puede hacer en mi sitio si lo desactivo?
Supongo que debe haber alguna razón por la que esto existe, pero no puedo imaginar de qué me protegería.
¿Podrías darme alguna idea?
¿Es seguro desactivar esto?
Gracias
Daniel
Verificar al remitente de esta manera puede ayudar a proteger contra la falsificación de solicitudes entre sitios .
Idealmente, querría una forma de hacer que la comprobación del referer coincida con su propio dominio o el dominio de la plataforma de pago, pero como es una verificación de subcadena simple en lugar de una coincidencia de patrón, no creo que esto sea posible.
Si desactivó esto, debe poner otras medidas en su lugar para protegerse contra tales ataques.
Esto es para proporcionar protección limitada para la Sesión de fijación y CSRF / XSRF. Verificar el referer es un método válido para detener xsrf . Un mejor método para detener la fijación de la sesión es Session.use_only_cookies
, porque un hacker no puede establecer una cookie en un navegador de víctimas para un dominio que ya no controla.
Sin embargo, php.net/manual/en/… es fácil de eludir. Solo busca una subcadena en el dominio de referencia. Si la subcadena falta totalmente, lo que sucede si la URL de origen es https: //, la identificación de la sesión no será válida. Sin embargo, debido a que es una subcadena y no una cadena completa, puede omitir esto para www.somedomain.com
al hacer referencia desde www.somedomain.com.some_hacker.com
. En resumen, creo que esto es completamente inútil .