[JAVA] [Schienen] Beachten Sie bei der Verwendung von Ajax die "CSRF-Maßnahmen".

Artikelinhalt

Ich habe die Kommentarfunktion (Kommentar) implementiert, indem ich Ajax verwendet habe, um einen Teilübergang durchzuführen. Ich werde den Stolperstein bei der Implementierung der Update-Funktion verlassen.

Entwicklungsumgebung

Ruby 2.7.2 Rails 6.0.3.4

Inhalt

Aktualisieren Sie den Inhalt (Text) des Kommentars (Kommentars), der dem Beitrag zugeordnet ist. Der Controller sieht so aus.

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

Der js-Code sieht so aus.

comment_edit.js


$(function() {
  //Auszug

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

      //Erfolgsabwicklung

    }).fail(function () {

      //Fehlerbehandlung

    });
  })
});

Wenn die Kommentaraktualisierung erfolgreich ist, wird der Erfolgsprozess ausgeführt. Ich habe jedoch einen 422-Fehler erhalten. Als ich das Rails-Protokoll überprüfte, war es wie folgt.

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):

Es heißt "CSRF-Token-Authentizität kann nicht überprüft werden". Anscheinend war die Ursache, dass das CSRF-Token nicht gewährt wurde.

Ich habe csrf_meta_tags in application.html.erb erwähnt.

ruby:application.html.erb


<!DOCTYPE html>
<html>
  <head>
    <title>Titel</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>

Es scheint als Gegenmaßnahme für CSRF beschrieben zu werden. Weitere Informationen finden Sie im Rails Guide. Rails Security Guide

Auf dieser Grundlage haben wir den folgenden Code in Form der Gewährung eines CSRF-Tokens hinzugefügt.

comment_edit.js


$(function() {
  //Auszug

    $.ajax({
      type: 'PATCH',
      url: '/comments/' + commentId,
      data: {
        comment: {
          body: body
        },
      },
//Nachtrag von hier
        headers: {
          'X-CSRF-Token' : $('meta[name="csrf-token"]').attr('content')
        },
//Nachtrag bis hierher
      dataType: 'json',
    }).done(function (data) {

      //Erfolgsabwicklung

    }).fail(function () {

      //Fehlerbehandlung

    });
  })
});

Dann hat es gut funktioniert.

Impressionen

Der PC ist ehrlich. Ich bekomme nur das, wozu ich angewiesen wurde (lacht)

Ich denke, es gibt andere Möglichkeiten, es zu schreiben. Möglicherweise möchten Sie die unten stehende Rails-Anleitung lesen. [Ajax CSRF-Token für Rails Guide](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

[Schienen] Beachten Sie bei der Verwendung von Ajax die "CSRF-Maßnahmen".
Achten Sie bei der Verwendung von MessageEncryptor mit Rails 5.2 / 6.0 auf den Zeitpunkt der Initialisierung
Einstellungen beim Aufrufen der API mithilfe von CSRF-Maßnahmen von Spring Security in JMeter
Dinge, die Sie beim Schreiben von Java beachten sollten
[Java] Dinge, die Sie bei der Ausgabe von FizzBuzz beachten sollten
Implementierung der Ajax-Entfernung in Rails
Fehler bei der Verwendung von Schienen Capybara
Detaillierte Tipps zur Verwendung von Rails
Dinge, die Sie beim Schreiben von Code in Java beachten sollten
[Rails] Japanische Lokalisierung der Fehlermeldung bei Verwendung des Formularobjekts
Seien Sie vorsichtig, wenn Sie mehrere Artikel verwenden
Um auf einfach zu lesenden Code zu achten
Misst, wenn kein Modell erstellt werden kann
[Rails] Beiträge können nicht gelöscht werden, wenn sie kommentiert werden! ??
5 Dinge, die neue Programmierer beachten sollten
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
Überprüfung der Auswirkungen auf die Leistung bei Verwendung von Java Volatile
[Java] Kurzschlüsse beachten (Kurzschlussauswertung)
[Rails] Implementierung des PV-Nummernrankings mit Impressionist
[Rails] Implementierung einer Bild-Diashow mit Bootstrap 3
Java Servlet sollte die Multithread-Umgebung kennen
Rails CSRF-Maßnahmen und HTML-Dateien unter public