Manejo de la protección de CSRF -- php campo con security camp codereview Relacionados El problema

Handling CSRF protection


3
vote

problema

Español

Actualmente estoy trabajando en una implementación de una protección de CSRF. ¿Cuál es la mejor práctica cuando detectamos un CSRF? ¿Es mejor en 404 la página, 403 (prohibida), 200 (OK) con un mensaje de error, algo más?

BONIFICACIÓN: Aquí está mi código. No estoy muy orgulloso del preg_replace y ob_* . Si también tiene sugerencias sobre cómo hacerlo mejor, también lo tomaré.

  • El método addCSRF65544332 se llama justo antes de enviar la salida de una página HTML.
  • El método checkCSRF3 cuando el servidor recibe una solicitud.

  <?php // This method checks if the content contains a form and adds a csrf_token hidden field public static function addCSRF() {     $content = ob_get_contents();     if (strlen($content))     {         // Random csrf token         $randomtoken = base64_encode(openssl_random_pseudo_bytes(32));         // Add the hidden input to the content if needed         $content = preg_replace('/(<([^>]*s)?form(s[^>]*)?>)/i', '1<input type="hidden" name="csrf_token" value="'.$randomtoken.'" />', $content, -1, $count);         // If at least one input has been added, add the csrf_token value in the $_SESSION and replace the content         if ($count)         {             Session::set('csrf_token', $randomtoken);             // Echo the new content             ob_end_clean();             ob_start();             echo $content;         }     }     return; } // This method checks if a form has been submited and if the csrf token is given and valid public static function checkCSRF() {     // No form submitted     if (!isset($_POST))         return;     // CSRF detected     if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] != Session::get('csrf_token'))     {         // 404 ? 403 ? 200 + error message ?     }     Session::forget('csrf_token'); }   
Original en ingles

I'm currently working on an implementation of a CSRF protection. What is the best practice when we detect a CSRF? Is it better to 404 the page, 403 (forbidden), 200 (OK) with an error message, something else?

Bonus : here's my code. I'm not very proud of the preg_replace and ob_*. If you also have suggestions on how to do it better, I'll take that too.

  • The addCSRF method is called just before sending the output of an HTML page.
  • The checkCSRF method is called when the server receives a request.

<?php // This method checks if the content contains a form and adds a csrf_token hidden field public static function addCSRF() {     $content = ob_get_contents();     if (strlen($content))     {         // Random csrf token         $randomtoken = base64_encode(openssl_random_pseudo_bytes(32));         // Add the hidden input to the content if needed         $content = preg_replace('/(<([^>]*\s)?form(\s[^>]*)?>)/i', '\1<input type="hidden" name="csrf_token" value="'.$randomtoken.'" />', $content, -1, $count);         // If at least one input has been added, add the csrf_token value in the $_SESSION and replace the content         if ($count)         {             Session::set('csrf_token', $randomtoken);             // Echo the new content             ob_end_clean();             ob_start();             echo $content;         }     }     return; } // This method checks if a form has been submited and if the csrf token is given and valid public static function checkCSRF() {     // No form submitted     if (!isset($_POST))         return;     // CSRF detected     if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] != Session::get('csrf_token'))     {         // 404 ? 403 ? 200 + error message ?     }     Session::forget('csrf_token'); } 
     

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Mientras intentaba agregar un huevo de Pascua en mi marco, vi esta respuesta: Overflow de pila que devuelve el código de error HTTP 418 (estoy una tetera)? .

Dado que parece que no hay una manera "correcta" de manejar CSRF, pensé que podría ser una cosa divertida. Al detectar un ataque de CSRF, mi marco ahora envía un encabezado HTTP 418 con un buen arte ASCII de una tetera de trolly.

Entonces, marco esta pregunta como respondió, porque no hay mejores prácticas reales (¡todavía?) Y cualquier cosa estaría bien.

 

While trying to add an easter egg on my framework, I saw this answer : Stack Overflow returning HTTP error code 418 (I'm a teapot)?.

Since it looks like there is no "correct" way to handle CSRF, I thought it could be a fun thing to do. Upon detecting a CSRF attack, my framework now sends a HTTP 418 header with a nice ASCII art of a trolly teapot.

So I mark this question as answered, because there's no real best practice (yet ?) and anything would be OK.

 
 

Relacionados problema

11  ¿Es esta una forma suficiente de prevenir las inyecciones de guiones y otras cosas malas en las cuerdas?  ( Is this a sufficient way to prevent script injections and other bad stuff in str ) 
¿Esta función será suficiente para eliminar todo el código malicioso y los caracteres extraños de una cadena? import java.security.SecureRandom; import jav...

6  Programa de recuperación de contraseña  ( Password recovery program ) 
Este es un programa de recuperación de contraseña que hice, y solo quiero que se revise. Estos no son todos los archivos para el sistema de inicio de sesión y...

11  Cifrado simétrico en C #  ( Symmetrical encryption in c ) 
Estoy tratando de cifrar simétricamente algunos datos utilizando C #, y parece que hay mucha información engañosa o incorrecta en el sujeto. He creado un pr...

2  Formulario básico de comentarios de PHP  ( Basic php comment form ) 
Soy un novato de programación. He escrito este simple script PHP para ejecutar un formulario de comentarios muy básico y apreciaría cualquier comentario, espe...

3  Formulario de contacto de WordPress PHP - Fallas de seguridad  ( Wordpress php contact form security flaws ) 
Tengo el siguiente formulario de contacto incluido con mi tema de WordPress como plantilla. Ahora, un usuario en StackOverFlow señaló que este formulario ti...

1  ¿Cómo puedo determinar y probar Vunerabilidades de inyección de SQL en este código de inicio de sesión?  ( How can i ascertain and test sql injection vunerabilities on this login code ) 
Sé que el escenario "Little Bobby Tablas" y se estaba preguntando si este código es vulnerable a tales inyecciones de SQL. Soy bastante nuevo en PHP y teng...

1  Simple Node.js WebServer  ( Simple node js webserver ) 
Estoy en el proceso de escribir un servidor web simple.js. Estoy a mitad de camino en términos de funcionalidad. Consulte el código completo en este pastebin...

8  Convertir un segurreque en una matriz de bytes  ( Converting a securestring to a byte array ) 
¿Asigna algo que no ha liberado? ¿Algo que permanece en la memoria? Excepto la matriz de bytes de resultado, OFC. checkOnline.sh1 ...

51  Cifrado seguro simplificado de una cadena  ( Simplified secure encryption of a string ) 
Tengo dos ejemplos de código que escribí para las mejores prácticas cifrando una cadena que busco comentarios tanto en términos de mejores prácticas y segurid...

10  Generando tokens de sesión difícil de adivinar  ( Generating hard to guess session tokens ) 
¿Este código crea tokens de sesión suficientemente difíciles de adivinar, asumiendo que el servidor y el cliente se comunican a través de HTTPS? Tomar 2 ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos