prevenir csrf en php
laravel get token csrf (3)
Exigir la autenticación en los parámetros GET y POST, no solo las cookies;
Comprobando el encabezado HTTP Referer;
vi esta publicación en wikipedia y me preguntaba cómo puedo aplicarla
ok ... estoy usando el framework PHP de Kohana y tengo la capacidad para determinar el encabezado de referencia, pero ¿qué es exactamente lo que reviso en el encabezado de referencia? la función de marco solo devuelve la URL del referente
y ¿cómo valido los parámetros GET y POST? ¿contra que? información almacenada? tipo esperado?
Con la verificación de referencias, todo lo que hace es asegurarse de que el referidor sea de su sitio / sistema. Si el referenciador no existe o es de un sitio extranjero, la verificación de referencia falla y es posible que no desee cumplir con cualquier solicitud que se realice.
En el pasado, los problemas con varias tecnologías y navegadores (flash..et al) permitían la falsificación de los encabezados de referencia. Es algo a considerar. Hay varios métodos que usan javascript para vincular a los recursos donde los datos de referencia no están presentes / pasados en el encabezado de la solicitud.
Este comportamiento varía un poco entre los navegadores. Si usa javascript para enviar un formulario, generalmente está bien. Si usa algo como window.location, probablemente no espere que los datos de referencia estén presentes.
Un método popular para la prevención de CSRF es no utilizar cookies y pasar siempre el estado entre referencias ... Pasar un token de sesión en todos los enlaces a través de una aplicación.
Para evitar CSRF, querrá validar un token de un solo uso, POST''ed y asociado con la sesión actual. Algo como lo siguiente. . .
En la página donde el usuario solicita eliminar un registro:
confirm.php
<?php
session_start();
$token= md5(uniqid());
$_SESSION[''delete_customer_token'']= $token;
session_write_close();
?>
<html>
<body>
<form method="post" action="confirm_save.php">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />
</form>
</body>
</html>
Luego, cuando se trata de eliminar realmente el registro:
confirm_save.php
<?php
session_start();
$token = $_SESSION[''delete_customer_token''];
unset($_SESSION[''delete_customer_token'']);
session_write_close();
if ($token && $_POST[''token'']==$token) {
// delete the record
} else {
// log potential CSRF attack.
}
?>
El token debería ser difícil de adivinar, único para cada solicitud de eliminación, aceptado solo a través de $ _POST y caducado después de unos minutos (el vencimiento no se muestra en este ejemplo).
[Nota:] El marco Kohana está obsoleto, el nuevo tenedor para Kohana PHP 7 es https://koseven.ga/ y es compatible con la funcionalidad CSRF de la clase Seguridad.
Puede usar la característica de seguridad oficial koseven. Aquí hay un enlace a la clase de seguridad koseven .