¿Sabes cómo proteger formularios PHP con tokens CSRF?
Los tokens CSRF se utilizan para proteger formularios en PHP, generaremos un token aleatorio y este se almacenará en la sesión y este token se pasará a través del formulario. Después del envío del formulario, se comparará el token CSRF del formulario y el token almacenado en la sesión. Si ambos valores coinciden, solo la presentación del formulario tendrá éxito. De lo contrario, el envío del formulario será fallido.
Puedes aprenderlo con un simple proceso de 6 pasos.
Acerca de tokens CSRF en formularios PHP
Cross-Site Request Forgery, en resumen, llamado como CSRF. CSRF Tokens nos ayuda a detener envíos de formularios falsos y ataques CSRF.
La Falsificación de solicitudes entre sitios (CSRF) es un ataque que obliga al usuario final a ejecutar acciones no deseadas en una aplicación web en la que está autenticado actualmente. Los ataques CSRF se dirigen específicamente a las solicitudes que cambian el estado, no al robo de datos, ya que el atacante no tiene forma de ver la respuesta a la solicitud falsificada. Con un poco de ayuda de ingeniería social (como enviar un enlace por correo electrónico o chat), un atacante puede engañar a los usuarios de una aplicación web para que ejecuten las acciones que el atacante elija. Si la víctima es un usuario normal, un ataque CSRF exitoso puede obligar al usuario a realizar solicitudes de cambio de estado, como la transferencia de fondos, el cambio de su dirección de correo electrónico, etc. Si la víctima es una cuenta de administrador, CSRF puede comprometer toda la aplicación web.
1. Generación de tokens CSRF
En este paso, generaremos el Token CSRF usando estas 3 funciones de PHP, que son rand, uniqid, md5. Usando estas 3 funciones podemos hacer una cadena aleatoria que se almacenará en la sesión y también se agregará en forma de campo de entrada oculto.
Aquí está el código para generar un token, lo estoy asignando a un token variable. Para que podamos usar esta variable token más tarde al agregar un token a la forma.
$token = md5(uniqid(rand(), TRUE));
Y el punto a tener en cuenta aquí es que generaremos un nuevo token CSRF en cada actualización de página. Eso significa que este token de CSRF almacenado en sesión se destruirá y se generará el nuevo token de CSRF. Verás más sobre la destrucción de sesión en el último paso.
2. Crear sesión con Token CSRF
Después de generar el token, debemos agregarlo a la sesión. Podemos almacenar este valor de token en sesión usando la sesión superglobal. Pero antes de eso, deberíamos comenzar la sesión con la función PHP session_start.
session_start ();
Estoy almacenando la sesión con el nombre de csrf_token, aquí está el código para crear la sesión de token de CSRF.
PHP
$ _SESSION ['csrf_token'] = $ token;
3. Agregar tokens CSRF para formar
Agregue el token CSRF generado al formulario, he asignado el token CSRF generado al token variable. Aquí para agregar este token en el formulario voy a usar la variable token.
La mayoría de las personas lo hace mal, al agregar un token almacenado en la sesión. Ese no es el método correcto, use la variable token en lugar del token almacenado en la sesión.
Y también estoy agregando campo de entrada de formulario como un campo de entrada oculto y con el nombre de csrf_token. Aquí hay un código para agregar el token CSRF a su formulario. Puedes simplemente copiar y pegar esto en tu formulario.
<input type = "hidden" name = "csrf_token" value = "<? php echo $ token;?>">
4. Comprobación de tokens CSRF
Después del envío del formulario, verificaremos el token CSRF que se envía a través del formulario y el token CSRF almacenado en la sesión.
Antes que nada, comprobaremos si post superglobal está configurado y no está vacío. Si es verdad, eso significa que si la condición es verdadera, entonces solo procederemos con el siguiente paso para verificar los tokens CSRF.
if (isset ($ _ POST) &! empty ($ _ POST)) {
// Comprobar el token CSRF enviado o no aquí
}
Para verificar los tokens CSRF, escribiré una condición if para verificar si el token csrf se envía a través del formulario o no. Si se envía, continuaremos con el siguiente paso que compara ambos tokens de CSRF.
if (isset ($ _ POST ['csrf_token'])) {
// compare el token de CSRF enviado a través del formulario y el token CSRF en sesión
$ msgs [] = "CSRF Token Verification Success";
}más{
$ csrferrors [] = "Verificación de testigo de CSRF fallida";
}
Escribiré una condición if que compare el token de los valores enviados y el token de la sesión. Y aquí está el código para comparar el token.
PHP
Agregue el token CSRF generado al formulario, he asignado el token CSRF generado al token variable. Aquí para agregar este token en el formulario voy a usar la variable token.
La mayoría de las personas lo hace mal, al agregar un token almacenado en la sesión. Ese no es el método correcto, use la variable token en lugar del token almacenado en la sesión.
Y también estoy agregando campo de entrada de formulario como un campo de entrada oculto y con el nombre de csrf_token. Aquí hay un código para agregar el token CSRF a su formulario. Puedes simplemente copiar y pegar esto en tu formulario.
<input type = "hidden" name = "csrf_token" value = "<? php echo $ token;?>">
4. Comprobación de tokens CSRF
Después del envío del formulario, verificaremos el token CSRF que se envía a través del formulario y el token CSRF almacenado en la sesión.
Antes que nada, comprobaremos si post superglobal está configurado y no está vacío. Si es verdad, eso significa que si la condición es verdadera, entonces solo procederemos con el siguiente paso para verificar los tokens CSRF.
if (isset ($ _ POST) &! empty ($ _ POST)) {
// Comprobar el token CSRF enviado o no aquí
}
Para verificar los tokens CSRF, escribiré una condición if para verificar si el token csrf se envía a través del formulario o no. Si se envía, continuaremos con el siguiente paso que compara ambos tokens de CSRF.
if (isset ($ _ POST ['csrf_token'])) {
// compare el token de CSRF enviado a través del formulario y el token CSRF en sesión
$ msgs [] = "CSRF Token Verification Success";
}más{
$ csrferrors [] = "Verificación de testigo de CSRF fallida";
}
Escribiré una condición if que compare el token de los valores enviados y el token de la sesión. Y aquí está el código para comparar el token.
PHP
if ($ _ SESSION ['csrf_token'] === $ _POST ['csrf_token']) {
// Proceda con el siguiente paso que es la funcionalidad de su formulario
$ msgs [] = "Éxito de Validación de Token CSRF";
}más{
$ csrferrors [] = "Validación de símbolo de CSRF Falló";
}
5. Procediendo con el próximo CódigoDespués de comparar con éxito el token CSRF, podemos pasar al siguiente paso. Es decir, puedes comenzar a procesar tu lógica.Si tiene un montón de código y desea escribirlo en un nuevo bloque, cree un nuevo bloque if y verifique si la matriz csrferrors está configurada o no.
if (! isset ($ csrferrors)) {// Procedemos con el siguiente paso que es la funcionalidad de su formulario}6. Destruyendo tokens CSRFDeberíamos destruir el token CSRF que está almacenado en la sesión. Al volver a cargar la página del formulario, este token de sesión se generará nuevamente y se almacenará en la sesión. Pero puede usar la función PHP no configurada para destruir la sesión en páginas como la página de cierre de sesión. Donde destruiremos la sesión de usuario redirigir a la página de inicio de sesión.En esta página de cierre de sesión, puede agregar este código y, en caso de que esté utilizando la función PHP de session_destroy, no necesita agregar ningún código.
unset ($ _ SESSION ['csrf_token']);Código Competente de Fichas CSRF con Formularios PHPSi tiene algún problema para organizar las piezas de código anteriores, puede usar este código completo.
if (! isset ($ csrferrors)) {// Procedemos con el siguiente paso que es la funcionalidad de su formulario}6. Destruyendo tokens CSRFDeberíamos destruir el token CSRF que está almacenado en la sesión. Al volver a cargar la página del formulario, este token de sesión se generará nuevamente y se almacenará en la sesión. Pero puede usar la función PHP no configurada para destruir la sesión en páginas como la página de cierre de sesión. Donde destruiremos la sesión de usuario redirigir a la página de inicio de sesión.En esta página de cierre de sesión, puede agregar este código y, en caso de que esté utilizando la función PHP de session_destroy, no necesita agregar ningún código.
unset ($ _ SESSION ['csrf_token']);Código Competente de Fichas CSRF con Formularios PHPSi tiene algún problema para organizar las piezas de código anteriores, puede usar este código completo.
0 Comentarios