Ich versuche, den Formularen auf meiner Website etwas Sicherheit zu verleihen. Eines der Formulare verwendet AJAX und das andere ist ein einfaches "Kontakt" -Formular. Ich versuche, ein CSRF-Token hinzuzufügen. Das Problem, das ich habe, ist, dass das Token nur manchmal im HTML- "Wert" angezeigt wird. Der Rest der Zeit ist der Wert leer. Hier ist der Code, den ich auf dem AJAX-Formular verwende:
PHP:
if (!isset($_SESSION)) {
session_start();
$_SESSION['formStarted'] = true;
}
if (!isset($_SESSION['token']))
{$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
}
HTML
<form>
//...
<input type="hidden" name="token" value="<?php echo $token; ?>" />
//...
</form>
Irgendwelche Vorschläge?
token_time
wird verwendet?token_time
. Ich wollte die Zeit begrenzen, innerhalb der ein Token gültig ist, habe den Code jedoch noch nicht vollständig implementiert. Aus Gründen der Klarheit habe ich es aus der obigen Frage entfernt.Antworten:
Für Sicherheitscodes generieren Sie Ihre Token bitte nicht wie folgt:
$token = md5(uniqid(rand(), TRUE));
rand()
ist vorhersehbaruniqid()
addiert nur bis zu 29 Bit Entropiemd5()
fügt keine Entropie hinzu, sondern mischt sie nur deterministischProbieren Sie es aus:
Generieren eines CSRF-Tokens
PHP 7
Nebenbemerkung: Eines der Open-Source-Projekte meines Arbeitgebers ist eine Initiative zum Backport
random_bytes()
undrandom_int()
in PHP 5-Projekte. Es ist MIT-lizenziert und auf Github und Composer als paragonie / random_compat verfügbar .PHP 5.3+ (oder mit ext-mcrypt)
Überprüfen des CSRF-Tokens
Nicht nur verwenden
==
oder sogar===
verwendenhash_equals()
(nur PHP 5.6+, sondern für frühere Versionen mit der Hash-kompatiblen Bibliothek verfügbar ).Mit Per-Form-Token noch weiter gehen
Sie können Token weiter einschränken, damit sie nur für ein bestimmtes Formular verfügbar sind, indem Sie verwenden
hash_hmac()
. HMAC ist eine bestimmte verschlüsselte Hash-Funktion, die auch bei schwächeren Hash-Funktionen (z. B. MD5) sicher verwendet werden kann. Ich empfehle jedoch, stattdessen die SHA-2-Familie von Hash-Funktionen zu verwenden.Generieren Sie zuerst ein zweites Token zur Verwendung als HMAC-Schlüssel und verwenden Sie dann die folgende Logik, um es zu rendern:
Verwenden Sie dann eine kongruente Operation, um das Token zu überprüfen:
Die für ein Formular generierten Token können nicht ohne Wissen in einem anderen Kontext wiederverwendet werden
$_SESSION['second_token']
. Es ist wichtig, dass Sie ein separates Token als HMAC-Schlüssel verwenden als das, das Sie gerade auf der Seite ablegen.Bonus: Hybridansatz + Zweigintegration
Jeder, der die Twig-Template-Engine verwendet, kann von einer vereinfachten Doppelstrategie profitieren, indem er diesen Filter zu seiner Twig-Umgebung hinzufügt:
Mit dieser Twig-Funktion können Sie beide Allzweck-Token wie folgt verwenden:
Oder die gesperrte Variante:
Twig befasst sich nur mit dem Rendern von Vorlagen. Sie müssen die Token noch ordnungsgemäß validieren. Meiner Meinung nach bietet die Twig-Strategie mehr Flexibilität und Einfachheit bei gleichzeitiger Wahrung der Möglichkeit maximaler Sicherheit.
CSRF-Token für den einmaligen Gebrauch
Wenn Sie die Sicherheitsanforderung haben, dass jedes CSRF-Token genau einmal verwendet werden darf, wird es nach jeder erfolgreichen Validierung mit der einfachsten Strategie neu generiert. Dadurch wird jedoch jedes vorherige Token ungültig, was sich nicht gut mit Personen vermischt, die mehrere Registerkarten gleichzeitig durchsuchen.
Paragon Initiative Enterprises unterhält eine Anti-CSRF-Bibliothek für diese Eckfälle. Es funktioniert ausschließlich mit Einweg-Token pro Formular. Wenn in den Sitzungsdaten genügend Token gespeichert sind (Standardkonfiguration: 65535), werden die ältesten nicht eingelösten Token zuerst ausgewechselt.
quelle
Sieht so aus, als ob Sie ein anderes mit Ihrem Wenn brauchen.
quelle
md5(uniqid(rand(), TRUE));
Sicherheitskontexten nicht vertrauen .Die Variable
$token
wird nicht aus der Sitzung abgerufen, wenn sie sich dort befindetquelle