User Tools

Site Tools


en:dev:284:security

This is an old revision of the document!


FIXME This page is not fully translated, yet. Please help completing the translation.
(remove this paragraph once the translation is finished)

System Security

(A whole package of individual elements. From password encryption to measurements to protect against cross-site scripting.)

SecureTokens gegen CrossSiteScripting

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 SecureTokens 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

FTAN ⇒ Dieser Begriff wurde in Anlehnung an die TransAktionsNummern 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 16-stelligen, alphanumerischen Bezeichner sowie dem zugehörigen, ebenfalls 16-stelligen, alphanumerischen Wert. Sowohl Bezeichner als auch der Wert ändern sich bei jedem Request auf Zufallsbasis.

IDKEY ⇒ 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, 16-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.

Feste Einstellungen

Konstante Wert Beschreibung
LIFETIME_MIN 1800 Minimale Lebensdauer eines Tokens in Sekunden
LIFETIME_MAX 7200 Maximale Lebensdauer eines Tokens in Sekunden
LIFETIME_STEP 900 Einstellbare Schrittweite zwischen MIN und MAX in Sekunden
DEBUG_LIFETIME 300 Tokenlebensdauer in Sekunden im DEBUG-Modus

Die maximale Lebenszeit von Tokens ist auf eine vernünftige, sinnvolle Bearbeitungsdauer eingestellt und sollte auf keinen Fall verlängert werden. Grundsätzlich verfallen auch alle Tokens, wenn die aktuelle Session ihren Timeout erreicht.
:!: Je länger die mögliche Bearbeitungszeit wird, desto grösser wird das Risiko einer erfolgreichen Attacke.


Registry-Settings

(Variable Einstellmöglichkeiten)
Diese vier Werte können im Backend unter Settings-Sicherheit eingestellt werden.

SecTokenLifeTime
Die 'Lebensdauer' von Tokens kann in Schritten von LIFETIME_STEP-Sekunden von LIFETIME_MIN bis LIFETIME_MAX eingestellt werden.
Die Einstellung erfolgt durch einen entsprechenden Eintrag in der Registry mittels der Settings des Backends.
Wird ein negativer Wert (<0) eingegeben, so wird der Debug-Modus mit einer Lebensdauer von DEBUG_LIFTIME-Sekunden aktiviert.

SecTokenFingerprint
Hiermit kann das Fingerprinting des Client vollständig eingeschaltet(true) oder ausgeschaltet(false) werden.
Die Abschaltung wird aus Sicherheitsgründen nicht empfohlen!

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.

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.


Verfügbare Methoden

::getFTAN

Prototype: <php>mixed getFTAN(mixed $mMode = 'POST')</php>
Gibt die FTAN des aktuellen Requests zurück. 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. Das Argument $mMode definiert das Rückgabeformat der Methode.

  • 'POST' liefert einen HTML Input Tag zurück ( <input type=“hidden” name=“FTAN-name” value=“FTAN-wert” title=“”> )
  • 'GET' liefert einen String, der in ein URL-Argument eingefügt werden kann ( 'FTAN-name=FTAN-wert' )
  • 'RAW' liefert ein Array zur Übergabe an eine Template-Engine, wobei der Index 'name' den FTAN-name und der Index 'value' den FTAN-wert enthält.

::checkFtan

Prototype: <php>bool checkFTAN(mixed $mMode = 'POST', bool $bPreserve = false)</php>
Es wird überprüft, ob im aktuellen Request eine gültige FTAN übergeben wurde. Das Argument $mMode bestimmt, wo nach der FTAN gesucht werden soll. Per default ist dies $_POST, bei jeder anderen Angabe $_GET, Jede gefundene, gültige FTAN wird danach sofort aus der Liste der aktiven FTANs gelöscht. Sie kann also grundsätzlich nur ein einziges Mal abgefragt werden. Bei gültiger FTAN ist der Rückgabewert TRUE andernfalls FALSE.

::getIDKEY

Prototype: <php>string getIDKEY(mixed $mValue)</php>
Der an die Methode übergebene Wert wird gesichert und dafür ein einmaliger, 16-stelliger, alphanumerischer Schlüsselwert zurückgegeben. Es können folgende Datentypen übergeben werden: String, Integer und Array. Der zurückgegebene Schlüsselwert wird einfach anstatt des Originalwertes an den Client gesendet.

::checkIDKEY

Prototype: <php>mixed checkIDKEY(string $sFieldname, mixed $mDefault = 0, string $sRequest = 'POST'. bool $bPreserve = false)</php>

  • $sRequest Enthält dieses Argument den Wert 'POST oder GET, so wird der Inhalt von $sFieldname als Bezeichner eines POST oder GET Elementes, dessen Wert entschlüsselt werden soll, genutzt. Enthält es dagegen 'RAW' so ist der Inhalt von $sFieldname selbst der zu decodierende Schlüsselwert.
  • $mDefault ist der Wert, der zurückgegeben wird, falls der Schlüsselwert ungültig ist.

::sanitizeLifeTime

Prototype: <php>integer sanitizeLifeTime(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.

::getTokenLifeTime

Prototype: <php>array getTokenLifeTime(void)</php>
Gibt ein Array mit folgenden Schlüsseln zurück:

Schlüssel Beschreibung
min minimale Lebensdauer in Sekunden
max maximale Lebensdauer in Sekunden
step Schrittweite in Sekunden
value Eingestellte Laufzeit in Sekunden

Wozu werden diese Werte benötigt? An das Template übergeben, lässt sich z.B. eine Fortschrittsanzeige realisieren, die optisch die Zeit bis zum Timeout anzeigt.


Anwendungsbeispiele

:!: Achtung: Requests müssen eindeutig sein! Der 'action' Parameter eines form Tags darf keine zusätzlichen URL-Argumente ( *.php?x=1 ) enthalten. Eventuell notwendige Zusatzargumente müssen mit <input type=“hidden” …> übergeben werden.

Formular

<PHP> $sOutput = '<form method=“post” action=“index.php”>'

       . $oReg->App->getFTAN()
       . '<input type="hidden" name="record_id" value="'.$oReg->App->getIDKEY($iRecordId).'">';

echo $sOutput;

Auswertung if ($oReg→App→checkFTAN('POST')) { } $iRecordId = $oReg→App→checkIDKEY('record_id', 0, 'POST'); </PHP> === Link === <PHP> $sOutput = '<a href=“index.php?'.$oReg→App→getFTAN('GET').'&record_id=' . $oReg→App→getIDKEY($iRecordId),'” title=“xx”>Tu was</a>'; echo $sOutput; Auswertung

if ($oReg→App→checkFTAN('GET')) { }

$iRecordId = $oReg→App→checkIDKEY('record_id', 0, 'GET'); </PHP>

Twig-Template

<PHP> view-script

$aTwigdata['TargetUrl'] = 'index.php'; $aTwigdata['FTAN'] = $oReg→App→getFTAN('RAW'); $aTwigdata['RecordId'] = $oReg→App→getIDKEY($record_id); </PHP> <PHP> twig-template

Beispiel 1 <form method=“post” action=“targeturl”> <input type=“hidden” name=“ftan.name” value=“ftan.value”> <input type=“hidden” name=“record_id” value=“recordid”> […] </form> Beispiel 2 <a href=“targeturl?ftan.name=ftan.value&record_id=recordid” title=“xx”>Tu was</a> </PHP> <PHP> save-script

Beispiel 1 if ($oReg→App→checkFTAN()) { $record_id = $oReg→App→checkIDKEY('record_id'); […] } Beispiel 2 if ($oReg→App→checkFTAN('GET')) {

  $record_id = $oReg->App->checkIDKEY('record_id', 0, 'GET');
  [...]

} </PHP>

en/dev/284/security.1458848228.txt.gz · Last modified: 24.03.2016 19:37 by mrbaseman