Cuándo y cómo generar nonce para URL

0

Tengo una url con un parámetro $ _GET que permite eliminar un registro en mi base de datos, por ejemplo. localhost / app / delete.php? id = 4843.

La página delete.php solo verifica si el usuario ha iniciado sesión y si es el propietario del registro de la base de datos. Obviamente, esto crea la apertura perfecta para un ataque CSRF. ¿Debo generar el nonce cuando se carga la página, o lo hago de alguna manera solo cuando el usuario hace clic en la URL? ¿Cómo podría?

Aquí está mi código hasta ahora:

function nonce_create() {
   $_SESSION["nonce"] = random_bytes(12);
   $_SESSION["nonce_time"] = time();
}

function nonce_verify() {
   $time = time() - 90; /* give browser 90 seconds to load */
   if (isset($_SESSON["nonce"]) && strlen($_SESSION["nonce"]) == 7 && $_SESSION["nonce_time"] > $time) {
      $_SESSION["nonce"] = null;
   }
   else {
      header("location: index.php");
   }
}

Se llamará a la función nonce_create () anterior al cargar la página donde hay enlaces a la página delete.php, y se llamará a la función nonce_verify () cuando sea necesario verificar y eliminar el nonce en delete.php.

    
pregunta John S 31.10.2017 - 17:18
fuente

1 respuesta

1

No estoy seguro de entender cómo podría funcionar tu código. ¿Establece un nonce en la sesión y luego verifica que todavía está allí? ¡Ese siempre será el caso!

El solo uso de la sesión no ayuda, ya que la sesión se mantiene junto con la ayuda de una cookie. Y las cookies se envían en todas las solicitudes, por lo que la cookie de sesión se incluiría en los requisitos CSRF. No puede usar sesiones solas para diferenciar los ataques CSRF y los requisitos legítimos.

La protección adecuada de CSRF requiere que el cliente coloque el nonce (o el token como comúnmente se llama) en otro lugar, como en un encabezado HTTP, donde el navegador de las víctimas no lo incluiría automáticamente. Y luego puede verificar que ese valor corresponda al valor que ha almacenado en la sesión.

En cuanto a cuándo generar el token, diría que un token por sesión es suficiente. Cada vez que reciba una solicitud de una sesión que no tenga un token, genere una nueva para ellos y guárdela durante toda la sesión.

Hay muchos detalles sobre cómo implementar esto, y no es posible incluir todo aquí. En su lugar, te recomendaré que hagas esto:

respondido por el Anders 31.10.2017 - 17:44
fuente

Lea otras preguntas en las etiquetas