Dans PHP, Hash_Equals est une fonction utilisée pour comparer si deux chaînes sont égales. Il est souvent utilisé pour éviter les attaques temporelles, comme lors de la vérification des valeurs de hachage. Il améliore la sécurité en comparant chaque caractère de deux chaînes pour s'assurer que le temps du processus de comparaison est constant.
Cependant, dans certains cas, les développeurs ont constaté que l'utilisation fréquente de HASH_Equals peut entraîner une croissance anormale de l'utilisation de la mémoire et des fuites de mémoire. Cet article analysera les causes possibles et donnera des suggestions pour éviter les fuites de mémoire.
hash_equals (String $ connu_string, string $ user_string): bool
Fonction: Comparez en toute sécurité si deux chaînes sont égales.
Scénarios d'application: comparaison de hachage de mot de passe, vérification de la signature de l'API, etc.
Exemple de code:
<?php
$known = '5f4dcc3b5aa765d61d8327deb882cf99';
$userInput = '5f4dcc3b5aa765d61d8327deb882cf99';
if (hash_equals($known, $userInput)) {
echo "Correspondre avec succès";
} else {
echo "Le match a échoué";
}
?>
PHP lui-même implémente HASH_EQUALS relativement stable, mais si certaines extensions ou des versions spécifiques de PHP sont utilisées, il peut y avoir des fuites de mémoire non réparées.
Hash_Equals exige que les deux paramètres soient des chaînes et doivent être de la même longueur. Le passage des paramètres de non-cordes ou de longueur différents peut provoquer des exceptions de mémoire sous-jacentes, en particulier dans les appels de boucle pour amplifier le problème.
Lorsque Hash_Equals est appelé à plusieurs reprises sur de très grandes chaînes et les variables ne sont pas correctement libérées dans le script, une croissance de la mémoire peut se produire.
Vérifiez les paramètres entrants avant d'appeler pour vous assurer qu'ils sont des chaînes et avoir la même longueur, et éviter les problèmes potentiels causés par les conversions implicites.
<?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);
}
?>
Dans les scripts ou boucles de longue durée, évitez les références de variables inutiles et nettoyez la mémoire dans le temps.
<?php
for ($i = 0; $i < 100000; $i++) {
$known = 'hash_value_here';
$user = getUserInput(); // Supposons qu'il s'agit d'une fonction qui obtient l'entrée
safe_hash_equals($known, $user);
unset($user);
// Également disponible gc_collect_cycles() Collection de déchets forcés(Utiliser avec prudence)
}
?>
De nombreux problèmes de gestion de la mémoire ont été résolus dans la nouvelle version de PHP, et il est recommandé d'utiliser la dernière version stable. Vérifiez également l'état de mise à jour des extensions pertinentes.
Si possible, mettez en cache les résultats ou évitez les appels répétés à HASH_Equals pour réduire la pression de la mémoire.
Hash_Equals est une bonne aide pour une comparaison sûre des chaînes en PHP, mais une mauvaise utilisation peut entraîner des fuites de mémoire. La clé pour éviter les fuites de mémoire est:
Assurez-vous que les paramètres sont légaux et que le type et la longueur correspondent.
Gérer raisonnablement les variables et libérer la mémoire en temps opportun.
Utilisez la dernière version de PHP et des extensions connexes.
Réduisez les appels en double inutiles.
Cela peut garantir la sécurité de l'application dans la plus grande mesure possible tout en évitant l'impact de la fuite de mémoire sur les performances du système.
Si vous souhaitez en savoir plus sur l'utilisation des fonctions de sécurité PHP, veuillez vous référer à la documentation officielle et aux meilleures pratiques de la communauté, telles que la visite https://gitbox.net/php-manual/fonction.hash_equals.html pour plus de détails.