Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
dev:284:security [22.10.2017 10:02] – [Einsatz mit AJAX] Manuela v.d.Decken | dev:284:security [06.12.2020 11:31] – [Timeout Progressbar] 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// | + | 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**. |
- | Im Unterschied zu der einfachen, 4-stelligen TAN jedoch besteht | + | Im Unterschied zu der einfachen, 4-stelligen TAN jedoch besteht |
**// | **// | ||
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 | + | 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 |
**SecTokenIpv6Netmask**\\ | **SecTokenIpv6Netmask**\\ | ||
- | Hiermit wird der zu überprüfende | + | Hiermit wird der zu überprüfende |
---- | ---- | ||
==== Verfügbare Methoden ==== | ==== Verfügbare Methoden ==== | ||
- | === ::getFtan | + | === ::getToken |
- | **Prototype: | + | **Prototype: |
- | Gibt ein Array zurück, das die FTAN des aktuellen Requests sowie zusätzliche Daten zurückgibt. | + | Gibt ein Array zurück, das die FTAN des aktuellen Requests sowie zusätzliche Daten zurückgibt. |
Gibt ein Array mit folgenden Schlüsseln zurück: | Gibt ein Array mit folgenden Schlüsseln zurück: | ||
- | ^Schlüssel ^ Type ^ Beschreibung ^ | + | ^Schlüssel ^ Value-Type ^ Beschreibung ^ |
| name | string | Bezeichner des Tokens | | | name | string | Bezeichner des Tokens | | ||
| value | string | Wert des Tokens | | | value | string | Wert des Tokens | | ||
Zeile 56: | Zeile 56: | ||
| previous | string | vorheriger Wert des Tokens | | | previous | string | vorheriger Wert des Tokens | | ||
Der Wert ' | Der Wert ' | ||
- | === ::checkFtan | + | === ::checkToken |
- | **Prototype: | + | **Prototype: |
- | Es wird überprüft, | + | Es wird überprüft, |
- | 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: | + | **Prototype: |
Der an die Methode übergebene Wert wird gesichert und dafür ein einmaliger, 6-stelliger, | Der an die Methode übergebene Wert wird gesichert und dafür ein einmaliger, 6-stelliger, | ||
Es können alle skalaren Datentypen übergeben werden: **// | Es können alle skalaren Datentypen übergeben werden: **// | ||
+ | === :: | ||
+ | **Prototype: | ||
+ | * **// | ||
=== :: | === :: | ||
**Prototype: | **Prototype: | ||
- | * **// | + | * **// |
- | === ::sanitizeLifeTime | + | === ::sanitizeTokenLifeTime |
- | **Prototype: | + | **Prototype: |
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, | 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, | ||
=== :: | === :: | ||
Zeile 89: | Zeile 92: | ||
=== Formular === | === Formular === | ||
<PHP> | <PHP> | ||
- | use bin\security\SecureTokens; | + | use bin\Security\CsfrTokens; |
- | $aFtan = SecureTokens::getFtan(); | + | $aToken |
$sOutput = '< | $sOutput = '< | ||
- | . '< | + | . '< |
- | . '< | + | . '< |
echo $sOutput; | echo $sOutput; | ||
// Auswertung | // Auswertung | ||
- | if (SecureTokens::checkFtan()) { | + | if (CsfrTokens::checkToken()) { |
/* alles OK */ | /* alles OK */ | ||
- | $iRecordId = SecureTokens::checkIdKey(' | + | $iRecordId = CsfrTokens::decodeIdKey(' |
[…] | […] | ||
} | } | ||
Zeile 106: | Zeile 109: | ||
=== Link === | === Link === | ||
<PHP> | <PHP> | ||
- | use bin\security\SecureTokens; | + | use bin\Security\CsfrTokens; |
- | $aFtan = SecureTokens::getFtan(); | + | $aToken |
- | $sOutput = '<a href=" | + | $sOutput = '<a href=" |
- | | + | |
echo $sOutput; | echo $sOutput; | ||
// Auswertung | // Auswertung | ||
- | if (SecureTokens::checkFtan()) { | + | if (CsfrTokens::checkToken()) { |
/* alles OK */ | /* alles OK */ | ||
- | $iRecordId = SecureTokens::checkIdKey(' | + | $iRecordId = CsfrTokens::decodeIdKey(' |
[…] | […] | ||
} | } | ||
Zeile 122: | Zeile 125: | ||
=== Twig-Template === | === Twig-Template === | ||
<PHP> | <PHP> | ||
- | use bin\security\SecureTokens; | + | use bin\Security\CsfrTokens; |
/* view-script */ | /* view-script */ | ||
$aTwigdata[' | $aTwigdata[' | ||
- | $aTwigdata[' | + | $aTwigdata[' |
- | $aTwigdata[' | + | $aTwigdata[' |
</ | </ | ||
<PHP> | <PHP> | ||
Zeile 134: | Zeile 137: | ||
// Beispiel 1 | // Beispiel 1 | ||
< | < | ||
- | < | + | < |
< | < | ||
[…] | […] | ||
Zeile 140: | Zeile 143: | ||
// Beispiel 2 | // Beispiel 2 | ||
- | <a href=" | + | <a href=" |
</ | </ | ||
<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 = CsfrTokens::decodeIdKey(' |
[…] | […] | ||
} | } | ||
Zeile 154: | Zeile 157: | ||
==== Einsatz mit AJAX ==== | ==== Einsatz mit AJAX ==== | ||
- | SecureTokens | + | CsfrTokens |
<div alert> | <div alert> | ||
- | Grundsätzlich gilt natürlich auch für Ajax-Requests die übliche Regel, dass Änderungsanfragen | + | Grundsätzlich gilt natürlich auch für Ajax-Requests die übliche Regel, dass Änderungsanfragen |
- | 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 |
- | Im Rückschluss bedeutet das, dass in der Ajax-Antwort | + | Im Rückschluss bedeutet das, dass in der Ajax-Antwort |
- | Ab der Version 1.0.1 stellt | + | Ab der Version 1.0.1 stellt |
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: | - Ein AJAX-Request muss den HTTP-Header **KIPA-XAJAX: | ||
- | - 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)//). |
</ | </ | ||
**zu Punkt (1): | **zu Punkt (1): | ||
- | Bei GET Requests genügt ein einfacher URL-Argumentestring mit den FTAN-Werten | + | Bei GET Requests genügt ein einfacher URL-Argumentestring mit den TOKEN-Werten |
**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.\\ |
- | < | + | < |
**zu Punkt (4):**\\ | **zu Punkt (4):**\\ | ||
- | Das ist der ' | + | Das ist der ' |
- | <code javascript | + | <code javascript |
< | < | ||
- | function | + | function |
- | var i, ax, regex = new RegExp(oFtan.name + " | + | var i, ax, regex = new RegExp(oToken.name + " |
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, | + | ax[i].href = ax[i].href.replace(regex, |
} | } | ||
- | 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 205: | Zeile 208: | ||
</ | </ | ||
==== Timeout Progressbar ==== | ==== Timeout Progressbar ==== | ||
- | Dies ist eine Möglichkeit, eine Progressbar einzubauen, die die Restzeit bis zum Ablauf der Session/des Tokens anzeigt. | + | Dies ist eine von sehr vielen Möglichkeiten, eine Progressbar einzubauen, die die Restzeit bis zum Ablauf der Session/des Tokens anzeigt. |
Es ist nur ein Beispiel, wie derartiges funktionieren könnte. Selbstverständlich kann jeder seine persönliche Lösung des Problems erstellen! | Es ist nur ein Beispiel, wie derartiges funktionieren könnte. Selbstverständlich kann jeder seine persönliche Lösung des Problems erstellen! | ||
- | <code css> | + | <file css KiSessionProgress.css> |
/* css */ | /* css */ | ||
< | < | ||
Zeile 239: | Zeile 242: | ||
} | } | ||
</ | </ | ||
- | </code> | + | </file> |
- | <code html> | + | <file html5 KiSessionProgress.html> |
<!-- html --> | <!-- html --> | ||
<div id=" | <div id=" | ||
< | < | ||
</ | </ | ||
- | </code> | + | </file> |
- | <code javascript> | + | <file javascript |
/* javascript */ | /* javascript */ | ||
< | < | ||
Zeile 294: | Zeile 297: | ||
* put the following line somwhere after the script above! | * put the following line somwhere after the script above! | ||
*/ | */ | ||
- | updateKiSessionProgressBar({{ | + | updateKiSessionProgressBar({{ |
</ | </ | ||
- | </code> | + | </file> |