Anhängen von CSRF-Token an Links in Snippets
In Version 3.2 wurde ein Sicherheits-Bugfix eingebaut welches dass sogenanntes Cross-Side Request Forgery (CSRF) verhindern soll.
Zu diesem Zweck wird ein anti-CSRF Token verwendet, der im Folgenden nur noch CSRF Token genannt wird.
Dieser Token wird von kvwmap beim Start einer neuen Session gebildet und bei jeder Anfrage an den Server in folgenden Variablen zur Verfügung gestellt.
- PHP: $_SESSION['csrf_token']
- JavaScript: csrf_token
Die JavaScript Variable csrf_token wird global in der Datei funktionen/gui_defs.php gesetzt, welche wiederum in der Datei layout/snippets/gui_head.php eingebunden ist, die in kvwmap in jedem jedem Snippets includiert ist. Custom Dateien können entweder auch die gui_defs.php einbinden oder im Kopf selbst die Variable setzen mit:
<script language="javascript" type="text/javascript"> var csrf_token = '<? echo $_SESSION['csrf_token']; ?>'; </script>
Um den Token an einen Link in PHP anzuhängen verwendet man am einfachsten die Funktion add_csrf($url). Sie hat den Vorteil gegenüber dem Anhängen an die URL, dass vorher geprüft wird ob in der URL go= vorkommt. Wenn nicht, z.b. bei externen Links, wird der Token nicht angehängt. Außerdem wird geprüft ob am Ende der URL noch ein Anker steht, z.b. #meinanchor. In diesem Fall wird der Token vor den Anker geschrieben. Die folgenden Beispiele zeigt wie man Links um den CSRF-Token in PHP und JavaScript erweitern kann.
URL ohne CSRF-Token
$html = '<a href="index.php?go=Menues_Anzeigen&view_sort=id&sort_direction=' . $this->formvars['sort_direction'] . '">Menü öffnen</a>';
PHP CSRF-Token in PHP-String direkt anhängen
$html = '<a href="index.php?go=Menues_Anzeigen&view_sort=id&sort_direction=' . $this->formvars['sort_direction'] . '&csrf_token=' . $_SESSION['csrf_token'] . '">Menü öffnen</a>';
PHP CSRF-Token in HTML einfügen
<a href="index.php?go=Menues_Anzeigen&view_sort=id&sort_direction=<? echo $this->formvars['sort_direction']; ?>&csrf_token=<? echo $_SESSION['csrf_token']; ?>">Menü öffnen</a>
PHP CSRF-Token mit add_csrf
$url = 'https://meinserver.de/kvwmap/index.php?go=show_snippet&snippet=list_data&layer_id=774&anzahl=100#anchor_16486848'; $html = '< href="' . add_csrf($url) . '">Mein Linktext</a>';
JavaScript CSRF-Token in HTML einbinden
<input type="button" onclick="location.href='https://meinserver.de/kvwmap/index.php?go=Layer-Suche_Suchen&operator_new_gid==&selected_layer_id=60040&value_new_gid=' + myjavascriptgidvar + '&csrf=' + csrf_token + " value="Für Suche klick hier" />
PHP CSRF-Token in jQuery ajax Funktion einbinden
function menuedaten_delete(id) { Check = confirm('Menüpunkt wirklick löschen?'); if (Check == true) { $.ajax({ url: 'index.php', data: { go: 'Menue_Löschen', selected_menue_id: id, csrf_token: '<? echo $_SESSION['csrf_token']; ?>' }, error: function(response) { message(response.msg); }, success: function(response) { $('#menue_' + id).fadeOut(1000); } }); } }
Beachtet werden sollte auf jeden Fall wie man mit den Anführungszeichen umgeht. Eine Zuweisung in Javascript erwartet Anführungszeichen. Bei der Verwendung der Funktion ahah(url, data, target, action, progress) brauchen die Variablen url und data den CSRF-Token nicht enthalten, da er in der Funktion hinzugefügt wird.