Benutzer-Werkzeuge

Webseiten-Werkzeuge


dev:284:security

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
dev:284:security [22.12.2018 15:36] – [::getFtan] Manuela v.d.Deckendev:284:security [06.12.2020 11:33] (aktuell) – [Begriffserklärung] Manuela v.d.Decken
Zeile 3: Zeile 3:
 (ein ganzes Paket an Einzelelementen. Von Passwortverschlüsselung bis zum Schutz vor CrossSiteScripting.)  (ein ganzes Paket an Einzelelementen. Von Passwortverschlüsselung bis zum Schutz vor CrossSiteScripting.) 
  
-===== SecureTokens =====+===== CsfrTokens =====
 Ein wesentlicher Bestandteil zum Schutz gegen CrossSiteScripting ist der Einsatz von Tokens bei der Übermittlung von Formularen und sonstigen Änderungsanforderungen. Ein wesentlicher Bestandteil zum Schutz gegen CrossSiteScripting ist der Einsatz von Tokens bei der Übermittlung von Formularen und sonstigen Änderungsanforderungen.
-WebsiteBaker stellt dafür die Klasse **bin\security\S//ecureTokens//** zur Verfügung. Diese Klasse wird grundsätzlich immer automatisch vom Kern geladen und stellt ihre Methoden zur Verfügung. Die Konfiguration der Klasse und auch der Einsatz der Methoden wurde so einfach wie möglich gehalten.+WebsiteBaker stellt dafür die Klasse **bin\Security\CsfrTokens** zur Verfügung. Diese Klasse wird grundsätzlich immer automatisch vom Kern geladen und stellt ihre Methoden zur Verfügung. Die Konfiguration der Klasse und auch der Einsatz der Methoden wurde so einfach wie möglich gehalten.
 ==== Begriffserklärung ==== ==== Begriffserklärung ====
-**//FTAN//** => Dieser Begriff wurde in Anlehnung an die **T**rans**A**ktions**N**ummern beim Onlinebanking gewählt, da auch sie nur für eine einmalige Transaktion innerhalb eines festgelegten Zeitraums gültig sind.\\ +**//TOKEN//** => Ehemals **FTAN**. Dieser Begriff wurde in Anlehnung an die **T**rans**A**ktions**N**ummern beim Onlinebanking gewählt, da auch sie nur für eine einmalige Transaktion innerhalb eines festgelegten Zeitraums gültig sind.\\ 
-Im Unterschied zu der einfachen, 4-stelligen TAN jedoch besteht eine vollständige FTAN aus einem 6-stelligen, alphanumerischen Bezeichner sowie dem zugehörigen, ebenfalls 6-stelligen, alphanumerischen Wert. Sowohl Bezeichner als auch der Wert ändern sich bei jedem normalen Request auf Zufallsbasis. Bei Ajaxaufrufen ändert sich nur der Value-Anteil der FTAN+Im Unterschied zu der einfachen, 4-stelligen TAN jedoch besteht ein vollständiger Token aus einem 6-stelligen, alphanumerischen Bezeichner sowie dem zugehörigen, ebenfalls 6-stelligen, alphanumerischen Wert. Sowohl Bezeichner als auch der Wert ändern sich bei jedem normalen Request auf Zufallsbasis. Bei Ajaxaufrufen ändert sich nur der Value-Anteil des Tokens
  
 **//IDKEY//** => Ist das zweite Standbein der Sicherung. Er wird hauptsächlich eingesetzt, um die Datensatz-IDs in Formularen und anderen Requests zu verschleiern. Die ID wird dabei durch einen einmaligen, 6-stelligen, alphanumerischen Wert ersetzt. Wird ein gleicher Wert mehrmals verschlüsselt, so bekommt er **immer** einen anderen Ersatzwert. Für jeden Request, für jedes Formular können beliebig viele IDKEYs erzeugt werden. Der IDKEY verhindert z.B. zuverlässig, dass auf Clientseite in einem Änderungsformular die reale DatensatzId vor dem Absenden manipuliert werden kann und dadurch unzulässigerweise ein falscher Datensatz geändert oder gar gelöscht wird. **//IDKEY//** => Ist das zweite Standbein der Sicherung. Er wird hauptsächlich eingesetzt, um die Datensatz-IDs in Formularen und anderen Requests zu verschleiern. Die ID wird dabei durch einen einmaligen, 6-stelligen, alphanumerischen Wert ersetzt. Wird ein gleicher Wert mehrmals verschlüsselt, so bekommt er **immer** einen anderen Ersatzwert. Für jeden Request, für jedes Formular können beliebig viele IDKEYs erzeugt werden. Der IDKEY verhindert z.B. zuverlässig, dass auf Clientseite in einem Änderungsformular die reale DatensatzId vor dem Absenden manipuliert werden kann und dadurch unzulässigerweise ein falscher Datensatz geändert oder gar gelöscht wird.
Zeile 37: Zeile 37:
  
 **SecTokenIpv4Netmask**\\ **SecTokenIpv4Netmask**\\
-Hiermit wird der zu überprüfende Netzanteil einer IPv4 Adresse festgelegt. Möglich sind Netzmaskenlängen von 1-32 Bit. Eine Länge von 0 Bit setzt die IPv4-Überprüfung ausser Funktion. Je höher der angegebene Wert ist, desto restriktiver ist die Einstellung.+Hiermit wird der zu überprüfende Netzanteil einer IPv4 Adresse festgelegt. Möglich sind Netzmaskenlängen von 1-32 Bit. Eine Länge von 0 Bit setzt die IPv4-Überprüfung außer Funktion. Je höher der angegebene Wert ist, desto restriktiver ist die Einstellung.
  
 **SecTokenIpv6Netmask**\\ **SecTokenIpv6Netmask**\\
-Hiermit wird der zu überprüfende Netzanteil einer IPv6 Adresse festgelegt. Möglich sind Netzmaskenlängen von 1-128 Bit. Eine Länge von 0 Bit setzt die IPv6-Überprüfung ausser Funktion. Je höher der angegebene Wert ist, desto restriktiver ist die Einstellung.+Hiermit wird der zu überprüfende Präfix einer IPv6 Adresse festgelegt. Möglich sind Längen von 1-128 Bit. Eine Länge von 0 Bit setzt die IPv6-Überprüfung außer Funktion. Je höher der angegebene Wert ist, desto restriktiver ist die Einstellung.
 ---- ----
  
  
 ==== Verfügbare Methoden ==== ==== Verfügbare Methoden ====
-=== ::getFtan === +=== ::getToken === 
-**Prototype:** <php>getFtan(void):array</php>\\ +**Prototype:** <php>getToken(void):array</php>\\ 
-Gibt ein Array zurück, das die FTAN des aktuellen Requests sowie zusätzliche Daten zurückgibt. Beim ersten Aufruf von getFTAN() innerhalb eines Requests wird eine neue FTAN erzeugt, die dann während des laufenden Requests beliebig oft abgerufen werden kann.+Gibt ein Array zurück, das die FTAN des aktuellen Requests sowie zusätzliche Daten zurückgibt. Während des Programmstarts wird automatisch ein neuer Token erzeugt, der dann während des laufenden Requests beliebig oft abgerufen werden kann.
  
 Gibt ein Array mit folgenden Schlüsseln zurück: Gibt ein Array mit folgenden Schlüsseln zurück:
Zeile 56: Zeile 56:
 | previous | string | vorheriger Wert des Tokens | | previous | string | vorheriger Wert des Tokens |
 Der Wert 'remain' kann zur Anzeige eines Timeout-Countdowns mittels Javascript genutzt werden. Der Wert 'remain' kann zur Anzeige eines Timeout-Countdowns mittels Javascript genutzt werden.
-=== ::checkFtan === +=== ::checkToken === 
-**Prototype:** <php>checkFtan(void):bool</php>\\ +**Prototype:** <php>checkTokenn(void):bool</php>\\ 
-Es wird überprüft, ob im aktuellen Request eine gültige FTAN übergeben wurde. Die Methode sucht die nötigen Angaben automatisch in den Argumenten des aktuellen Requests. Diese Methode merkt sich das Ergebnis der Prüfung, welches während eines Requests beliebig oft abgefragt werden kann. +Es wird überprüft, ob im aktuellen Request ein gültiger Token übergeben wurde. Die Methode sucht die nötigen Angaben automatisch in den Argumenten des aktuellen Requests. Diese Methode merkt sich das Ergebnis der Prüfung, welches während eines Requests beliebig oft abgefragt werden kann. 
-Bei gültiger FTAN ist der Rückgabewert TRUE andernfalls FALSE.+Bei gültigem Token ist der Rückgabewert TRUE andernfalls FALSE.
  
-=== ::getIdKey === +=== ::createIdKey === 
-**Prototype:** <php>getIdKey(scalar $mValue):string</php>\\+**Prototype:** <php>createIdKey(scalar $mValue):string</php>\\
 Der an die Methode übergebene Wert wird gesichert und dafür ein einmaliger, 6-stelliger, alphanumerischer Schlüsselwert zurückgegeben. Der an die Methode übergebene Wert wird gesichert und dafür ein einmaliger, 6-stelliger, alphanumerischer Schlüsselwert zurückgegeben.
 Es können alle skalaren Datentypen übergeben werden: **//String//**, **//Integer//**, **//Float//**. Der zurückgegebene Schlüsselwert wird einfach anstatt des Originalwertes an den Client gesendet. Es können alle skalaren Datentypen übergeben werden: **//String//**, **//Integer//**, **//Float//**. Der zurückgegebene Schlüsselwert wird einfach anstatt des Originalwertes an den Client gesendet.
  
 +=== ::isValidIdKey ===
 +**Prototype:** <php>isValidIdKey(string $sToken[, bool $bPreserve = false]):bool</php>\\
 +  * **//$sToken//** Ein String wird überprüft, ob er einen gültigen IdKey darstellt. Die Rückgabe ist schlicht 'true' oder 'false'. Diese Methode kann beliebig oft angewendet werden.
 === ::decodeIdKey === === ::decodeIdKey ===
 **Prototype:** <php>decodeIdKey(string $sToken[, bool $bPreserve = false]):scalar</php>\\ **Prototype:** <php>decodeIdKey(string $sToken[, bool $bPreserve = false]):scalar</php>\\
-  * **//$sToken//** Ein Token, bzw. IdKey, dessen realer Wert ausgelesen werden soll. Dieser Wert kann nur ein einziges MAl gelesen werden.+  * **//$sToken//** Ein Token, bzw. IdKey, dessen realer Wert ausgelesen werden soll. Dieser Wert kann nur ein einziges MAL gelesen werden.
  
-=== ::sanitizeLifeTime === +=== ::sanitizeTokenLifeTime === 
-**Prototype:** <php>integer sanitizeLifeTime(integer $iLifeTime)</php>\\+**Prototype:** <php>integer sanitizeTokenLifeTime(integer $iLifeTime)</php>\\
 Ein übergebener Integer-Wert wird auf eine verfügbare Intervallstufe zwischen LIFETIME_MIN und LIFETIME_MAX korrigiert. Ein negativer Wert bei aktiviertem DEBUG-Modus auf DEBUG_LIFETIME, ansonsten auf LIFETIME_MIN. Ein ungültiger Wert grundsätzlich auf LIFETIME_MIN. Der berechnete Wert wird zurückgegeben. Ein übergebener Integer-Wert wird auf eine verfügbare Intervallstufe zwischen LIFETIME_MIN und LIFETIME_MAX korrigiert. Ein negativer Wert bei aktiviertem DEBUG-Modus auf DEBUG_LIFETIME, ansonsten auf LIFETIME_MIN. Ein ungültiger Wert grundsätzlich auf LIFETIME_MIN. Der berechnete Wert wird zurückgegeben.
 === ::getTokenLifeTime === === ::getTokenLifeTime ===
Zeile 89: Zeile 92:
 === Formular === === Formular ===
 <PHP> <PHP>
-use bin\security\SecureTokens+use bin\Security\CsfrTokens
-$aFtan SecureTokens::getFtan();+$aToken CsfrTokens::getToken();
 $sOutput = '<form method="post" action="index.php">' $sOutput = '<form method="post" action="index.php">'
-         . '<input type="hidden" name="'.$aFtan['name'].'" value="'.$aFtan['value'].'">' +         . '<input type="hidden" name="'.$aToken['name'].'" value="'.$aToken['value'].'">' 
-         . '<input type="hidden" name="record_id" value="'.SecureTokens::getIdKey($iRecordId).'">';+         . '<input type="hidden" name="record_id" value="'.CsfrTokens::createIdKey($iRecordId).'">';
 echo $sOutput;     echo $sOutput;    
  
 // Auswertung // Auswertung
  
-if (SecureTokens::checkFtan()) {+if (CsfrTokens::checkToken()) {
     /* alles OK */      /* alles OK */ 
-    $iRecordId = SecureTokens::checkIdKey('record_id');+    $iRecordId = CsfrTokens::decodeIdKey('record_id');
     […]     […]
 } }
Zeile 106: Zeile 109:
 === Link === === Link ===
 <PHP> <PHP>
-use bin\security\SecureTokens+use bin\Security\CsfrTokens
-$aFtan SecureTokens::getFtan(); +$aToken CsfrTokens::getToken(); 
-$sOutput = '<a href="index.php?'.$aFtan['name'].'='.$aFtan['value'].'&record_id=' +$sOutput = '<a href="index.php?'.$aToken['name'].'='.$aToken['value'].'&record_id=' 
-         SecureTokens::getIdKy($iRecordId),'" title="xx">Tu was</a>';+         CsfrTokens::createIdKy($iRecordId),'" title="xx">Tu was</a>';
 echo $sOutput;     echo $sOutput;    
  
 // Auswertung // Auswertung
  
-if (SecureTokens::checkFtan()) {+if (CsfrTokens::checkToken()) {
     /* alles OK */     /* alles OK */
-    $iRecordId = SecureTokens::checkIdKey('record_id');+    $iRecordId = CsfrTokens::decodeIdKey('record_id');
     […]     […]
 } }
Zeile 122: Zeile 125:
 === Twig-Template === === Twig-Template ===
 <PHP> <PHP>
-use bin\security\SecureTokens;+use bin\Security\CsfrTokens;
 /* view-script */ /* view-script */
  
 $aTwigdata['TargetUrl'] = 'index.php'; $aTwigdata['TargetUrl'] = 'index.php';
-$aTwigdata['FTAN'     SecureTokens::getFtan(); +$aTwigdata['TOKEN'    CsfrTokens::getToken(); 
-$aTwigdata['RecordId'SecureTokens::getIdkey($record_id);+$aTwigdata['RecordId'CsfrTokens::createIdkey($record_id);
 </PHP> </PHP>
 <PHP> <PHP>
Zeile 134: Zeile 137:
 // Beispiel 1 // Beispiel 1
  <form method="post" action="{{ TargetUrl }}">  <form method="post" action="{{ TargetUrl }}">
-   <input type="hidden" name="{{ FTAN.name }}" value="{{ FTAN.value }}">+   <input type="hidden" name="{{ TOKEN.name }}" value="{{ TOKEN.value }}">
    <input type="hidden" name="record_id" value="{{ RecordId }}">    <input type="hidden" name="record_id" value="{{ RecordId }}">
    […]    […]
Zeile 140: Zeile 143:
  
 // Beispiel 2 // Beispiel 2
- <a href="{{ TargetUrl }}?{{ FTAN.name }}={{ FTAN.value }}&record_id={{ RecordId }}" title="xx">Tu was</a>+ <a href="{{ TargetUrl }}?{{ TOKEN.name }}={{ TOKEN.value }}&record_id={{ RecordId }}" title="xx">Tu was</a>
 </PHP> </PHP>
 <PHP> <PHP>
Zeile 146: Zeile 149:
  
 // Beispiel 1 + 2 // Beispiel 1 + 2
-use bin\security\SecureTokens+use bin\Security\CsfrTokens
-if (SecureTokens::checkFtan()) { +if (CsfrTokens::checkToken()) { 
-    $record_id = SecureTokens::checkIdKey('record_id');+    $record_id = CsfrTokens::decodeIdKey('record_id');
     […]     […]
 }    }   
Zeile 154: Zeile 157:
 ==== Einsatz mit AJAX ==== ==== Einsatz mit AJAX ====
  
-SecureTokens in Verbindung mit Ajax erfordert etwas mehr Aufmerksamkeit. Wobei es Unterschiede zwischen den Major-Versionen von WebsiteBaker gibt. +CsfrTokens in Verbindung mit Ajax erfordert etwas mehr Aufmerksamkeit. Wobei es Unterschiede zwischen den Major-Versionen von WebsiteBaker gibt. 
  
 <div alert>Die folgende Beschreibung gilt vorerst nur für Versionen der 2er Serie, deren Module noch mit der veralteten Technik arbeiten und PHP-Dateien im Modulverzeichnis direkt aufrufen.</div> <div alert>Die folgende Beschreibung gilt vorerst nur für Versionen der 2er Serie, deren Module noch mit der veralteten Technik arbeiten und PHP-Dateien im Modulverzeichnis direkt aufrufen.</div>
  
-Grundsätzlich gilt natürlich auch für Ajax-Requests die übliche Regel, dass Änderungsanfragen eine gültige FTAN mitliefern müssen. Prinzipiell ist das bei normalen Requests ja kein Problem, da als Antwort immer eine komplett neue Seite aufgebaut wird die automatisch auch neue, gültige FTANs etc. enthält.\\ +Grundsätzlich gilt natürlich auch für Ajax-Requests die übliche Regel, dass Änderungsanfragen einen gültigen TOKEN mitliefern müssen. Prinzipiell ist das bei normalen Requests ja kein Problem, da als Antwort immer eine komplett neue Seite aufgebaut wird die automatisch auch neue, gültige TOKENSs etc. enthält.\\ 
-Bei einem Ajax-Request hingegen wird die Seite ja **nicht** automatisch neu aufgebaut. Also werden auch für die verbrauchten keine neuen FTANs eingetragen. Jeder weitere Aufruf würde also deshalb zwingend eine Fehlermeldung zur Folge haben.\\ +Bei einem Ajax-Request hingegen wird die Seite ja **nicht** automatisch neu aufgebaut. Also werden auch für die verbrauchten keine neuen TOKENs eingetragen. Jeder weitere Aufruf würde also deshalb zwingend eine Fehlermeldung zur Folge haben.\\ 
-Im Rückschluss bedeutet das, dass in der Ajax-Antwort eine neue FTAN mit zurückgeliefert werden muss, die die bisherige ersetzt.\\+Im Rückschluss bedeutet das, dass in der Ajax-Antwort ein neuer TOKEN mit zurückgeliefert werden muss, die die bisherige ersetzt.\\
  
-Ab der Version 1.0.1 stellt SecureTokens in Verbindung mit WebsiteBaker ab 2.11.0 die FTAN-Unterstützung von AJAX-Requests bereit.\\+Ab der Version 1.0.1 stellt CsfrTokens die TOKEN-Unterstützung von AJAX-Requests bereit.\\
 Um diese neue Funktionalität nutzen zu können, müssen 4 Bedingungen erfüllt werden. Um diese neue Funktionalität nutzen zu können, müssen 4 Bedingungen erfüllt werden.
 <div info> <div info>
-  - Ein AJAX-Request muss selbstverständlich die beiden Teile der FTAN (name, value) senden. +  - Ein AJAX-Request muss selbstverständlich die beiden Teile des TOKEN (name, value) senden. 
   - Ein AJAX-Request muss den HTTP-Header **KIPA-XAJAX: 1** senden.   - Ein AJAX-Request muss den HTTP-Header **KIPA-XAJAX: 1** senden.
-  - Ein AJAX-Response muss vom Server ein **Ftan** Objekt zurück bringen. +  - Ein AJAX-Response muss vom Server ein **TOKEN** Objekt zurück bringen. 
-  - Browserseitig muss ein Script dafür sorgen, dass das zurückgelieferte **Ftan** Objekt verarbeitet wird (//RenewFtan(oFtan)//).+  - Browserseitig muss ein Script dafür sorgen, dass das zurückgelieferte **Token** Objekt verarbeitet wird (//RenewToken(oToken)//).
 </div> </div>
  
  
 **zu Punkt (1):**\\  **zu Punkt (1):**\\ 
- Bei GET Requests genügt ein einfacher URL-Argumentestring mit den FTAN-Werten <html>url?foo=xx&abcdef=123456</html> angehängt.\\  Für POST wird einfach ein zusätzliches Inputfeld <html><input type="hidden" name="abcdef" value="123456"></html> verwendet.+ Bei GET Requests genügt ein einfacher URL-Argumentestring mit den TOKEN-Werten <html>url?foo=xx&abcdef=123456</html> angehängt.\\  Für POST wird einfach ein zusätzliches Inputfeld <html><input type="hidden" name="abcdef" value="123456"></html> verwendet.
  
 **zu Punkt (2):**\\ **zu Punkt (2):**\\
Zeile 179: Zeile 182:
  
 **zu Punkt (3):**\\ **zu Punkt (3):**\\
- die Rückgabe des Ftan - Objektes. Das ist durch einen Einzeiler sehr einfach zu erledigen.\\ + die Rückgabe des Token-Objektes. Das ist durch einen Einzeiler sehr einfach zu erledigen.\\ 
-<php>echo json_encode(\bin\security\SecureTokens::getFtan());</php> Selbstverständlich kann dieser Einzeiler auch in jede komplexere Rückgaberoutine eingebaut werden.\\+<php>echo json_encode(\bin\Security\CsfrTokens::getToken());</php> Selbstverständlich kann dieser Einzeiler auch in jede komplexere Rückgaberoutine eingebaut werden.\\
  
 **zu Punkt (4):**\\ **zu Punkt (4):**\\
- Das ist der 'aufwändigste' Punkt. Das zurückgegebene FTAN Objekt muss an z.B. die Funktion RenewFtan() übergeben werden. Diese Funktion tauscht sämtliche alten FTANs im gesamten Dokument gegen die neu erhaltenen aus. Zusätzlich kann noch eine Funktion übergeben werden, die eine SessionProgressBar neu startet: <html>RenewFtan(oFtan, callBackFunction);</html> IDKEYs werden durch Ajax-Requests **nicht** verändert oder ungültig.+ Das ist der 'aufwändigste' Punkt. Das zurückgegebene TOKEN Objekt muss an z.B. die Funktion RenewToken() übergeben werden. Diese Funktion tauscht sämtliche alten TOKENs im gesamten Dokument gegen die neu erhaltenen aus. Zusätzlich kann noch eine Funktion übergeben werden, die eine SessionProgressBar neu startet: <html>RenewTokenFtan(oToken, callBackFunction);</html> IDKEYs werden durch Ajax-Requests **nicht** verändert oder ungültig.
  
  
-<code javascript FtanResponse.js>+<code javascript TokenResponse.js>
 <script> <script>
-function RenewFtan(oFtan, refreshProgress) { +function RenewToken(oToken, refreshProgress) { 
-    var i, ax, regex = new RegExp(oFtan.name + "="oFtan.previous, "g");+    var i, ax, regex = new RegExp(oToken.name + "="oToken.previous, "g");
     ax = document.links;     ax = document.links;
     for (i = 0; i < ax.length; i++) {     for (i = 0; i < ax.length; i++) {
-        ax[i].href = ax[i].href.replace(regex, oFtan.name + "="oFtan.value);+        ax[i].href = ax[i].href.replace(regex, oToken.name + "="oToken.value);
     }     }
-    ax = document.getElementsByName(oFtan.name);+    ax = document.getElementsByName(oToken.name);
     for (i = 0; i < ax.length; i++) {     for (i = 0; i < ax.length; i++) {
-        ax[i].value = oFtan.value;+        ax[i].value = oToken.value;
     }     }
     if (refreshProgress) {     if (refreshProgress) {
-        refreshProgress(oFtan.remain);+        refreshProgress(oToken.remain);
     }     }
 } }
Zeile 294: Zeile 297:
  * put the following line somwhere after the script above!  * put the following line somwhere after the script above!
  */  */
-updateKiSessionProgressBar({{ Ftan.remain }});+updateKiSessionProgressBar({{ oToken.remain }});
 </script> </script>
 </file> </file>
dev/284/security.1545492995.txt.gz · Zuletzt geändert: 22.12.2018 15:36 von Manuela v.d.Decken