Voraussetzungen
Dieses Tutorial folgt auf meinen vorherigen Beitrag über Rails API Authentifizierung mit React Frontend.
Wie es funktioniert
- Nach dem Login speichert der Browser ein sicheres Cookie, das automatisch jeder Client-Anfrage beigefügt wird.
- Die Website eines Angreifers kann Anfragen im Namen des Benutzers fälschen, und diese werden authentifiziert.
Warum CORS CSRF nicht stoppt
- CORS (Cross-Origin Resource Sharing) kontrolliert, wer Antworten von Cross-Origin-Anfragen lesen kann.
- Es verhindert nicht, dass der Browser die Anfrage sendet.
- CSRF verlässt sich nicht auf das Lesen der Antwort – es braucht nur den Browser, um eine gültige Anfrage mit Cookies zu senden.
Lösung: Einen weiteren Validierungsvektor hinzufügen
- Erzeugen eines CSRF-Tokens auf dem Server.
- Rückgabe bei der Authentifizierung.
- Einbeziehung des CSRF-Tokens in den Anfragetext oder einen benutzerdefinierten Header für jede statusändernde Anfrage.
Rails 8 + React: Implementierung
1. CSRF-Token auf dem Server generieren
Konfigurieren Sie Rails so, dass ein CSRF-Token generiert und in einem Cookie gesendet wird.
In app/controllers/application_controller.rb:
class ApplicationController < ActionController::API
include ActionController::Cookies
include ActionController::RequestForgeryProtection
protect_from_forgery with: :exception
before_action :set_csrf_cookie
private
def set_csrf_cookie
cookies["CSRF-TOKEN"] = form_authenticity_token
end
end
2. CSRF-Token in React verwenden
Konfigurieren Sie Axios-Defaults in src/axios.ts:
import axios from "axios";
axios.defaults.xsrfCookieName = "CSRF-TOKEN";
axios.defaults.xsrfHeaderName = "X-CSRF-Token";
axios.defaults.withCredentials = true;
export default axios;
Dann in Ihrer Komponente:
import axios from "../axios";
export default function Register() {
useEffect(() => {
axios.get("api/csrf-token");
}, []);
function handleRegistration() {
axios.post("api/users", { email, password });
}
return (
// Ihr Formular-TSX
);
}
Fazit
Sie haben gelernt, wie CSRF funktioniert, warum CORS allein es nicht verhindert und wie man CSRF-Schutz in Rails 8 mit einem React-Frontend implementiert.