In PHP ist Hash_equals eine Funktion, mit der verglichen wird, ob zwei Zeichenfolgen gleich sind. Es wird häufig verwendet, um Zeitangriffe zu verhindern, beispielsweise bei der Überprüfung von Hash -Werten. Es verbessert die Sicherheit, indem jeder Charakter von zwei Zeichenfolgen verglichen wird, um sicherzustellen, dass die Vergleichsprozesszeit konstant ist.
In einigen Fällen haben Entwickler jedoch festgestellt, dass die häufige Verwendung von Hash_Equals zu einem abnormalen Wachstum der Speicherverwendung und des Speicherlecks führen kann. Dieser Artikel analysiert die möglichen Ursachen und gibt Vorschläge zur Vermeidung von Speicherlecks.
Hash_equals (String $ bekannte_string, String $ user_string): bool
Funktion: Vergleichen Sie sicher, ob zwei Zeichenfolgen gleich sind.
Anwendungsszenarien: Kennwort -Hash -Vergleich, API -Signaturüberprüfung usw.
Beispielcode:
<?php
$known = '5f4dcc3b5aa765d61d8327deb882cf99';
$userInput = '5f4dcc3b5aa765d61d8327deb882cf99';
if (hash_equals($known, $userInput)) {
echo "Erfolgreich übereinstimmen";
} else {
echo "Match fehlgeschlagen";
}
?>
PHP selbst implementiert Hash_equals relativ stabil, aber wenn einige Erweiterungen oder spezifische Versionen von PHP verwendet werden, können möglicherweise nicht reparierte Speicherlecks vorhanden sein.
Hash_equals erfordert, dass beide Parameter Zeichenfolgen sind und die gleiche Länge sein sollten. Durch die Übergabe von Nicht-String- oder unterschiedlichen Längenparametern kann zugrunde liegende Speicherausnahmen zugrunde liegen, insbesondere bei Schleifenaufrufen, um das Problem zu verstärken.
Wenn Hash_equals wiederholt auf sehr große Zeichenfolgen aufgefordert wird und Variablen im Skript nicht richtig freigegeben werden, kann das Gedächtniswachstum auftreten.
Überprüfen Sie die eingehenden Parameter, bevor Sie aufrufen, um sicherzustellen, dass sie Zeichenfolgen sind und die gleiche Länge haben, und vermeiden Sie potenzielle Probleme, die durch implizite Umbauten verursacht werden.
<?php
function safe_hash_equals($known, $user) {
if (!is_string($known) || !is_string($user)) {
return false;
}
if (strlen($known) !== strlen($user)) {
return false;
}
return hash_equals($known, $user);
}
?>
Vermeiden Sie in langjährigen Skripten oder Schleifen unnötige variable Referenzen und sauberer Speicher rechtzeitig.
<?php
for ($i = 0; $i < 100000; $i++) {
$known = 'hash_value_here';
$user = getUserInput(); // Angenommen, dies ist eine Funktion, die die Eingabe erhält
safe_hash_equals($known, $user);
unset($user);
// Auch verfügbar gc_collect_cycles() Erzwungene Müllsammlung(Verwendung mit Vorsicht)
}
?>
In der neuen Version von PHP wurden viele Probleme mit der Speicherverwaltung behoben, und es wird empfohlen, die neueste stabile Version zu verwenden. Überprüfen Sie auch den Aktualisierungsstatus relevanter Erweiterungen.
Wenn möglich, zwischen den Ergebnissen einspeichern oder wiederholte Aufrufe an Hash_equals vermeiden, um den Speicherdruck zu verringern.
Hash_equals ist ein guter Helfer für einen sicheren Vergleich von Strings in PHP, aber eine unsachgemäße Verwendung kann zu Speicherlecks führen. Der Schlüssel zur Vermeidung von Speicherlecks ist:
Stellen Sie sicher, dass die Parameter legal und die Art und Länge übereinstimmen.
Variablen vernünftig verwalten und den Speicher rechtzeitig freigeben.
Verwenden Sie die neueste Version von PHP und verwandten Erweiterungen.
Reduzieren Sie unnötige doppelte Anrufe.
Dies kann die Sicherheit der Anwendung so weit wie möglich gewährleisten und gleichzeitig die Auswirkungen von Speicherleckagen auf die Systemleistung vermeiden.
Wenn Sie mehr über die Verwendung von PHP-Sicherheitsfunktionen erfahren möchten, lesen Sie bitte die offiziellen Dokumentationen und die Best Practices der Community, z .