Comment fonctionne le jeton d’authenticité sur Rails ?

Le 02/12/2022

Dans Développement

Le token d’authenticité Rails est un jeton aléatoire généré par le framework Rails qui est utilisé pour protéger une application web contre les attaques CSRF (Cross-Site Request Forgery). Ce jeton est généré et envoyé à chaque client dans un formulaire HTML, et le serveur vérifie que le jeton reçu est identique à celui envoyé. Si le jeton est invalide ou absent, le serveur rejettera la demande et affichera une erreur. Le token d’authenticité est donc essentiel pour assurer la sécurité des applications web Rails.

Le token est généré à l’aide de l’algorithme de cryptage SHA-256 et est stocké dans une session Rails. Lorsque l’utilisateur soumet une requête, le token est vérifié pour s’assurer qu’il correspond à celui stocké dans la session. Si les deux tokens correspondent, la requête est authentifiée et traitée normalement. S’ils ne correspondent pas, la requête est rejetée et une erreur est renvoyée.

Voici un exemple de code qui génère et envoie le token d’authenticité Rails à un formulaire HTML :

<%= form_tag do %>

  <%= hidden_field_tag :authenticity_token, form_authenticity_token %>

  <!-- autres champs du formulaire -->

<% end %>

Comment fonctionne le jeton d’authenticité ?

Le jeton d’authenticité est généré par le framework Rails et est envoyé avec chaque requête POST, PUT ou DELETE. Lorsque la requête est reçue, le serveur vérifie que le jeton correspond à celui qui est stocké dans la session de l’utilisateur. Si les deux jetons ne correspondent pas, la requête est rejetée et une erreur est retournée.

Comment configurer le jeton d’authenticité ?

Le jeton d’authenticité est généralement configuré automatiquement par le framework Rails. Cependant, il est possible de le configurer manuellement si nécessaire. Pour ce faire, vous devrez modifier le fichier config/initializers/session_store.rb et ajouter une ligne de code semblable à celle-ci :

Rails.application.config.session_store :cookie_store, key: '_app_session', secure: true, same_site: :lax

Cette ligne de code configura le jeton d’authenticité pour qu’il soit stocké dans un cookie sécurisé et avec le paramètre same_site: :lax, qui permet de s’assurer que la requête ne provienne pas d’une autre origine.

Quels sont les risques liés à l’utilisation d’un jeton d’authenticité ?

Bien que le jeton d’authenticité soit un outil très utile pour protéger votre site web contre les attaques CSRF, il y a quelques risques à prendre en compte. Tout d’abord, le jeton est stocké dans un cookie, ce qui peut être une cible pour les attaques par injection de code. De plus, si le jeton est volé, l’utilisateur peut être victime d’une attaque CSRF. Pour ces raisons, il est important de s’assurer que votre site web est bien sécurisé et que toutes les requêtes sont envoyées via un protocole HTTPS.

Comment le token d’authenticité est-il généré et envoyé à un client ?

Le token d’authenticité est généré et envoyé à un client en ajoutant un champ caché à un formulaire HTML. Ce champ contient le jeton aléatoire généré par le framework Rails. Voici un exemple de code qui génère et envoie le token d’authenticité :

<%= form_tag do %>

  <%= hidden_field_tag :authenticity_token, form_authenticity_token %>

  <!-- autres champs du formulaire -->

<% end %>

Comment le serveur vérifie-t-il que le jeton reçu est valide ?

Le serveur vérifie que le jeton reçu est identique à celui envoyé en comparant les deux valeurs. Si le jeton est invalide ou absent, le serveur rejettera la demande et affichera une erreur. Voici un exemple de code qui vérifie le token d’authenticité :

# Vérifie que le token d'authenticité est valide

def check_authenticity_token

  if params[:authenticity_token] != session[:authenticity_token]

    # Token invalide, rejette la demande et affiche une erreur

    raise "Authenticity token is invalid"

  end

end

Comment Rails génère-t-il les jetons d’authenticité ?

Rails génère des jetons d’authenticité grâce à la méthode protect_from_forgery. Cette méthode génère un jeton aléatoire qui est ensuite utilisé pour vérifier que les données envoyées au serveur sont authentiques.

Comment Rails s’assure-t-il que le jeton d’authenticité est le bon ?

Rails vérifie le jeton d’authenticité en le comparant à celui qui est conservé sur le serveur. Rails ajoute le jeton d’authenticité à chaque formulaire enregistré sur le serveur et le compare à celui qui est envoyé par le navigateur lors de la soumission de la requête. Si les deux jetons correspondent, Rails exécute la demande et déclenche l’action appropriée. Si les jetons ne correspondent pas, Rails renvoie une erreur.

Comment le token d’authenticité est-il stocké et conservé entre les requêtes ?

Le token d’authenticité doit être stocké dans une variable de session afin que le serveur puisse vérifier que le jeton est toujours le même. De plus, il doit être conservé entre les requêtes pour que le serveur puisse vérifier que la demande provient bien d’un utilisateur authentifié. Voici un exemple de code qui stocke et conserve le token d’authenticité :

# Stocke et conserve le token d'authenticité

def store_authenticity_token

  session[:authenticity_token] = form_authenticity_token

end

Quelles sont les conséquences si le token d’authenticité est absent ou invalide ?

Si le token d’authenticité est absent ou invalide, le serveur rejettera la demande et affichera une erreur. Cette mesure permet de protéger l’application contre les attaques CSRF (Cross-Site Request Forgery). Voici un exemple de code qui rejette une demande si le token d’authenticité est invalide :

# Rejette la demande si le token d'authenticité est invalide

def check_authenticity_token

  if params[:authenticity_token] != session[:authenticity_token]

    # Token invalide, rejette la demande et affiche une erreur

    raise "Authenticity token is invalid"

  end

end

Conclusion

Le jeton d’authenticité de Rails est un outil très utile pour s’assurer que les requêtes envoyées par les utilisateurs sont bien authentiques et qu’elles ne sont pas victimes d’une attaque CSRF. Le jeton est généralement configuré automatiquement par le framework Rails et il est important de s’assurer que le site web est bien sécurisé et que toutes les requêtes sont envoyées via un protocole HTTPS pour éviter toute attaque.

D’autres astuces ruby sur https://rails.ovh/