Position actuelle: Accueil> Derniers articles> [Comment utiliser la fonction Strncmp pour obtenir une comparaison de chaîne sûre? Compétences essentielles pour le codage de sécurité PHP]

[Comment utiliser la fonction Strncmp pour obtenir une comparaison de chaîne sûre? Compétences essentielles pour le codage de sécurité PHP]

gitbox 2025-06-20

1. Quelle est la fonction strncmp ?

La fonction StrnCMP est une fonction fournie par PHP pour comparer deux chaînes. Contrairement à STRCMP , StrnCMP se compare dans le nombre spécifié de caractères, il est donc plus précis et sûr que les comparaisons de chaînes normales. La syntaxe de la fonction strncmp est la suivante:

 <span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> )
</span></span>
  • $ str1 : la première chaîne.

  • $ str2 : la deuxième chaîne.

  • $ Longueur : le nombre maximum de caractères à comparer.

Cette fonction renvoie une valeur entière et renvoie les situations suivantes en fonction de la relation de taille des deux chaînes:

  • Une valeur de retour de 0 signifie que les deux chaînes sont exactement égales dans la longueur spécifiée.

  • La valeur de retour est inférieure à 0 signifie que $ str1 est inférieur à $ STR2 .

  • La valeur de retour est supérieure à 0 signifie que $ str1 est supérieur à $ str2 .

2. Pourquoi avez-vous besoin d'utiliser Strncmp pour la comparaison des chaînes?

Dans PHP, les fonctions de comparaison de chaînes couramment utilisées sont StrCMP et StrCasecmpMP . Ces fonctions comparent toute la chaîne du début à la fin. Cependant, dans les applications liées à la sécurité, l'utilisation de ces fonctions peut directement présenter certains risques potentiels, en particulier face aux attaques de temps.

2.1 Attaque temporelle

L'attaque temporelle est une attaque qui déduit le contenu des données en mesurant la différence de temps passé par un système dans les opérations de comparaison. Un attaquant peut progressivement déduire la corde correcte en essayant constamment différentes chaînes et en fonction du temps consommé par l'opération de comparaison.

Par exemple, les fonctions STRCMP et StrcasecMP comparent deux chaînes de caractère par caractère et renvoient le résultat lorsque le premier caractère incompatible est trouvé. Cela signifie que si les premiers caractères des deux chaînes sont les mêmes, la fonction prendra plus de temps pour comparer les caractères suivants. Les attaquants peuvent en profiter pour trouver le bon ordre de caractère grâce à des essais répétés.

2.2 STRANCMP Sécurité

La fonction StrnCMP permet aux développeurs de limiter le nombre de caractères que les chaînes comparent. Cela signifie que même si les premiers chiffres des deux chaînes sont les mêmes, StrnCMP ne comparera que la longueur de caractères spécifiée et ne continuera pas à comparer d'autres caractères, réduisant ainsi la possibilité de déduire la chaîne par la différence de temps. Combiné avec le contrôle précis de la fonction StrnCMP , il peut éviter efficacement des attaques temporelles potentielles.

3. Comment utiliser Strncmp pour une comparaison de chaînes sûre?

Lors d'une comparaison de chaînes sécurisée, StrnCMP peut être utilisé de la manière suivante:

3.1 Comparaison des chaînes de longueur fixe

Lorsque vous devez comparer deux chaînes de longueur fixe, vous pouvez dire directement le nombre de caractères à comparer. Par exemple, si nous devons comparer deux hachages de longueur 16:

 <span><span><span class="hljs-variable">$hash1</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-variable">$hash2</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span>(</span><span><span class="hljs-variable">$hash1</span></span><span>, </span><span><span class="hljs-variable">$hash2</span></span><span>, </span><span><span class="hljs-number">32</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Les deux hachages sont les mêmes'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Différentes valeurs de hachage'</span></span><span>;
}
</span></span>

Dans cet exemple, nous utilisons la fonction strncmp pour limiter la comparaison de seulement 32 caractères, afin que les attaques temporelles puissent être évitées.

3.2 Comparez l'entrée utilisateur

Lorsque nous devons vérifier le mot de passe ou d'autres données sensibles saisies par l'utilisateur, nous devons essayer d'éviter d'utiliser directement STRCMP . La valeur de hachage de mot de passe entrée et stockée par l'utilisateur peut être comparée à strncmp . Par exemple:

 <span><span><span class="hljs-variable">$userInput</span></span><span> = </span><span><span class="hljs-string">'password123'</span></span><span>;
</span><span><span class="hljs-variable">$storedHash</span></span><span> = </span><span><span class="hljs-string">'$2y$10$4.2T70akfYlBpgk2JqJbVvDrzVX9pIHH9RbHg5bWlfu'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span>(</span><span><span class="hljs-variable">$userInput</span></span><span>, </span><span><span class="hljs-variable">$storedHash</span></span><span>, </span><span><span class="hljs-number">60</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Correspondance de mot de passe avec succès'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Mot de passe d&#39;erreur'</span></span><span>;
}
</span></span>

Dans cet exemple, nous supposons que l'utilisateur a saisi un mot de passe et l'a comparé à la valeur de hachage stockée. En limitant le nombre de caractères par rapport à 60, nous assurons la sécurité.

4. Comparaison de la fonction strncmp et hash_equals

Bien que StrnCMP offre un certain degré de sécurité, PHP fournit également une autre fonction plus spécifiquement pour les comparaisons de chaînes sécurisées - HASH_Equals . Hash_Equals est spécialement conçu pour éviter les attaques de temps, elle n'est pas affectée par la longueur de la chaîne ou la similitude du contenu, c'est donc un meilleur choix pour les comparaisons de hachage. L'utilisation est la suivante:

 <span><span><span class="hljs-variable">$expected</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-variable">$actual</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$expected</span></span><span>, </span><span><span class="hljs-variable">$actual</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'La valeur de hachage est la même'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Différentes valeurs de hachage'</span></span><span>;
}
</span></span>

Bien que Hash_Equals offre une sécurité plus élevée, StrnCMP est toujours une option viable dans certains cas si nous comparons simplement les caractères partiels (par exemple, en comparant les 32 premiers caractères d'une valeur de hachage).

5. Conclusion

Lors de la comparaison des chaînes, la sécurité devrait être l'un des premiers facteurs que nous considérons. L'utilisation de la fonction STRNCMP de PHP peut réduire efficacement le risque d'attaques temporelles, en particulier lors de la comparaison des chaînes de longueur fixe, ce qui peut aider les développeurs à améliorer la sécurité des applications. Cependant, StrnCMP n'est pas omnipotent, et pour des exigences de sécurité plus complexes (comme une comparaison complète des valeurs de hachage), l'utilisation de la fonction HASH_EQUALS serait un choix plus idéal.

En choisissant rationnellement la méthode de comparaison des chaînes, vous pouvez vous assurer que votre application PHP est plus sûre et plus fiable, protégeant les informations sensibles des utilisateurs contre les attaques potentielles.