[JAVA] [Rails] Lorsque vous utilisez ajax, faites attention aux "mesures CSRF".

Contenu de l'article

J'ai implémenté la fonction de commentaire (comment) en utilisant ajax pour faire une transition partielle. Je laisserai la pierre d'achoppement lors de la mise en œuvre de la fonction de mise à jour.

Environnement de développement

Ruby 2.7.2 Rails 6.0.3.4

Contenu

Mettez à jour le contenu (corps) du commentaire (commentaire) associé à la publication. Le contrôleur ressemble à ceci.

comment_controller.rb


class CommentsController < ApplicationController

  def update
    @comment = current_user.comments.find(params[:id])
    if @comment.update(comment_update_params)
      render json: @comment , status: :ok
    else
      render json: { comment: @comment, errors: { messages: @comment.errors.full_messages } }, status: :bad_request
    end
  end

  private

  def comment_update_params
    params.require(:comment).permit(:body)
  end
end

Le code js ressemble à ceci.

comment_edit.js


$(function() {
  //Extrait

    $.ajax({
      type: 'PATCH',
      url: '/comments/' + commentId,
      data: {
        comment: {
          body: body
        },
      },
      dataType: 'json',
    }).done(function (data) {

      //Traitement réussi

    }).fail(function () {

      //Traitement des échecs

    });
  })
});

Si la mise à jour des commentaires réussit, le processus de réussite sera exécuté. Cependant, j'ai eu une erreur 422. Lorsque j'ai vérifié le journal Rails, c'était comme suit.

Processing by CommentsController#update as JSON
  Parameters: {"comment"=>{"body"=>"Ah ah"}, "id"=>"36"}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 2ms (ActiveRecord: 0.0ms | Allocations: 834)



ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

Il dit "Impossible de vérifier l'authenticité du jeton CSRF". Apparemment, la cause était que le jeton CSRF n'avait pas été accordé.

J'ai mentionné csrf_meta_tags dans application.html.erb.

ruby:application.html.erb


<!DOCTYPE html>
<html>
  <head>
    <title>Titre</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

Il semble être décrit comme une contre-mesure pour le CSRF. Pour plus de détails, veuillez consulter le guide des rails. Guide de sécurité des rails

Sur cette base, nous avons ajouté le code suivant sous la forme d'octroi d'un jeton CSRF.

comment_edit.js


$(function() {
  //Extrait

    $.ajax({
      type: 'PATCH',
      url: '/comments/' + commentId,
      data: {
        comment: {
          body: body
        },
      },
//Post-scriptum d'ici
        headers: {
          'X-CSRF-Token' : $('meta[name="csrf-token"]').attr('content')
        },
//Postscript jusqu'à ici
      dataType: 'json',
    }).done(function (data) {

      //Traitement réussi

    }).fail(function () {

      //Traitement des échecs

    });
  })
});

Ensuite, cela a bien fonctionné.

Impressions

Le PC est honnête. Je ne reçois que ce que j'ai été chargé de faire (rires)

Je pense qu'il y a d'autres façons de l'écrire. Vous voudrez peut-être vous référer au guide Rails ci-dessous. [Rails Guide Ajax CSRF Token](https://railsguides.jp/working_with_javascript_in_rails.html#ajax%E3%81%AEcsrf%EF%BC%88cross-site-request-forgery%EF%BC%89%E3%83% 88% E3% 83% BC% E3% 82% AF% E3% 83% B3)

Recommended Posts

[Rails] Lorsque vous utilisez ajax, faites attention aux "mesures CSRF".
Faites attention au moment d'initialisation lors de l'utilisation de MessageEncryptor avec Rails 5.2 / 6.0
Paramètres lors de l'appel de l'API à l'aide des mesures CSRF de Spring Security dans JMeter
Points à prendre en compte lors de l'écriture de Java
[Java] Éléments à prendre en compte lors de la sortie de FizzBuzz
Implémentation de la suppression d'ajax dans Rails
Erreur lors de l'utilisation des rails capybara
Conseils détaillés lors de l'utilisation de Rails
Éléments à prendre en compte lors de l'écriture de code en Java
[Rails] Localisation japonaise du message d'erreur lors de l'utilisation de l'objet Form
Soyez prudent lorsque vous utilisez plusieurs articles
Être conscient du code facile à lire
Mesure lorsque le modèle ne peut pas être créé
[Rails] Les messages ne peuvent pas être supprimés lorsqu'ils sont commentés! ??
5 choses dont les nouveaux programmeurs devraient être conscients
[Rails] Implémentation de la fonction de recherche en utilisant le ransack de gem
[Rails] Implémentation de la fonction d'agrandissement d'image à l'aide de lightbox2
Vérification de l'impact sur les performances lors de l'utilisation de Java volatile
[Java] Attention aux courts-circuits (évaluation des courts-circuits)
[Rails] Mise en œuvre du classement des nombres PV à l'aide de l'impressionniste
[Rails] Implémentation du diaporama d'images à l'aide de Bootstrap 3
Le servlet Java doit être conscient de l'environnement multithread
Rails mesures CSRF et fichiers html sous public