2017-02-26 3 views
0

Kurz aber interessant hier. Ich habe hier wahrscheinlich etwas Seltsames, aber ich habe jetzt ein paar Stunden verloren und kann nicht herausfinden, was das Problem ist.Vergleich von random_bytes schlägt fehl, wenn Werte übereinstimmen

Ich habe eine Funktion, die eine Nonce erzeugt, so. Es ist im Moment nicht sehr komplex, aber es ist mehr ein Experimentieren mit einem Konzept, das für mich neu ist. Ich verwende random_bytes als der natürliche Nachfolger von mcrypt_create_iv für PHP7 +:

$token = random_bytes(16); 

diese dann wie so gespeichert ist:

$session->add('nonce',$token); 

(which is essentially....) 
$_SESSION[$var] = $val; 

während gleichzeitig in meiner Form, wie so verwendet:

<input name="token" type="hidden" value="<?=$token?>"> 

Das Formular sendet und übergibt einige Validierung und so weiter. Als Teil davon, rufe ich beiden Werte:

$token = $_POST['token']; 
$nonce = $session->get('nonce'); 

und dann habe ich einen Validierungspunkt für die weitere Ausführung - geht nur dann, wenn die beiden Werte übereinstimmen. Das Problem ist, ich kann sie nicht dazu bringen, das zu bestätigen. Keines dieser aktuellen Ausgabe wahr:

if(hash_equals($nonce, $token)) 
if($nonce === $token) 

var_dump zeigt beide Strings gleich lang, aber aus irgendeinem Grund sind sie nicht vergleichbar. Beide Werte sehen aus, als würden sie übereinstimmen.

if(hash_equals($nonce, $nonce)) 

auf true gleich (wie man erwarten würde), so kann ich nur annehmen, dass einer der Werte auf dem Weg verändert wird immer entweder durch $_POST oder über meine Retrieval-Funktion (die buchstäblich nur von der liest Session).

Ich würde mich über jede Hilfe/Vorschläge mit diesem - ich habe entweder übersehen, etwas offensichtlich, oder zu unerfahren mit diesem.

Antwort

3

Nicht alle zufälligen Bytewerte sind direkt in HTML gültig. Wenn die Zeichenfolge Werte außerhalb der regulären Folge von ASCII-Buchstaben und -Nummern ([0-9a-zA-z]) enthält, kann alles passieren, wenn Sie nicht für den HTML-Kontext es entkommen. Sie können htmlspecialchars verwenden, um die Werte bei Bedarf zu umgehen, oder stattdessen eine Hash- oder base64-codierte Version der zufälligen Bytes verwenden.

Ein gutes Beispiel wäre, wenn der Ascii-Wert von " in den 16 zufälligen Bytes enthalten ist, wird Ihr HTML-Attribut früh beendet. HTML mag Steuersequenzen (niedrige ASCII-Zeichen) oder Buchstaben außerhalb der aktuellen Codierung nicht sehr (wenn UTF-8, muss jeder Wert über 127 ein gültiger UTF-8-Codepunkt sein, wenn er über mehrere Bytes hinweg betrachtet wird).

+1

Ausgezeichnet - Ich habe meine Funktion zu '$ token = base64_encode (random_bytes (16));', die jetzt funktioniert. Ich wusste, es wäre etwas Einfaches, aber du bist trotzdem eine Legende! –

Verwandte Themen