36 lines
1.6 KiB
JavaScript
36 lines
1.6 KiB
JavaScript
// Fragt vor dem Absenden bestimmter Formulare nach einer Bestätigung.
|
|
//
|
|
// Früher stand die Abfrage direkt im HTML:
|
|
//
|
|
// <button onclick="return confirm('Wirklich löschen?')">
|
|
//
|
|
// Das funktioniert nicht mehr, seit der Server eine Content-Security-Policy
|
|
// schickt (siehe middleware/security.go). Die verbietet Inline-JavaScript —
|
|
// und zwar aus gutem Grund: Kann der Browser nicht unterscheiden, ob ein Stück
|
|
// Code vom Entwickler oder von einem Angreifer stammt, ist jede XSS-Lücke sofort
|
|
// ausnutzbar. Die Regel "Skripte nur aus eigenen Dateien" macht diesen
|
|
// Unterschied maschinell prüfbar.
|
|
//
|
|
// Die Bestätigung steht deshalb jetzt als data-confirm-Attribut am Formular,
|
|
// und dieses Skript hängt sich daran.
|
|
document.addEventListener("submit", function (event) {
|
|
var form = event.target;
|
|
|
|
// closest() sucht vom Element aufwärts nach dem passenden Vorfahren —
|
|
// hier reicht das Formular selbst, aber so bleibt es robust.
|
|
// event.submitter ist der Knopf, mit dem abgeschickt wurde. Hat ein
|
|
// Formular mehrere Knöpfe (etwa im Papierkorb: "wiederherstellen" und
|
|
// "endgültig löschen"), kann so jeder Knopf seine eigene Rückfrage
|
|
// haben — oder gar keine. Steht am Knopf nichts, gilt die des Formulars.
|
|
var btn = event.submitter;
|
|
var message = (btn && btn.getAttribute("data-confirm")) ||
|
|
(form.getAttribute && form.getAttribute("data-confirm"));
|
|
if (!message) {
|
|
return;
|
|
}
|
|
|
|
if (!window.confirm(message)) {
|
|
// preventDefault verhindert, dass der Browser das Formular abschickt.
|
|
event.preventDefault();
|
|
}
|
|
});
|