Dans certains cas, PHP convertira des données numériques (telles que chaîne contenant des nombres, etc.) en traitement numérique, == opérateur en fait partie. Lorsque vous utilisez l'opérateur == pour comparer vaguement deux chaînes, PHP convertira la chaîne numérique en une valeur numérique à des fins de comparaison. L'expérience suivante confirme cette conclusion :
<?php var_dump('01' == 1); ?>
La sortie du code ci-dessus Le résultat est : bool(true)
Par conséquent, lors de la comparaison de chaînes, il est recommandé d'utiliser l'opérateur === pour vérifier strictement la chaîne, ou d'utiliser la fonction strcmp() pour éviter d'éventuels problèmes.
De plus, la fonction in_array() couramment utilisée présente également des problèmes de type faible, voir le code suivant :
<?php var_dump(in_array('01', array('1'))); ?>
Le résultat de sortie du code ci-dessus est : bool(true)
Je crois que les programmeurs PHP qui ont utilisé cette fonction pour les contrôles de sécurité savent quel type de problèmes de sécurité cela entraînera, n'est-ce pas ? Heureusement, la fonction in_array() nous fournit un troisième paramètre. Le définir sur true peut activer le mécanisme de vérification de type obligatoire de la fonction in_array(), comme indiqué dans le code suivant :
<?php var_dump(in_array('01', array('1'), true)); ?>
Sortie Le résultat est : bool(false)
Puisque PHP est un langage faiblement typé, c'est-à-dire que la notion de type de données est affaiblie en PHP. Par conséquent, si vous ignorez trop les types de données lors de la programmation (ce qui est également un problème courant chez la plupart des programmeurs PHP), certains problèmes surviendront et même des failles de sécurité se produiront. Enfin, comme le dit le dicton ennuyeux, vérifiez et filtrez strictement les données externes.
Effets secondaires
$a = '212345678912000005'; $b = '212345678912000001'; var_dump($a == $b);
La sortie de ce code est bool(true), ce qui signifie que ce jugement conclura que les deux sont égaux. Similaire La fonctionnalité est utilisée lorsque le troisième paramètre de la fonction in_array() est faux ou n'est pas défini. La raison est d'abord de déterminer si la chaîne est un nombre, puis de la convertir en long ou double (langage C . type de données) puis déterminez - utilisez zendi_smart_strcmp. Cependant, les commentaires dans le code source indiquent que l'instruction considère les situations de débordement
} else if (dval1 == dval2 && !zend_finite(dval1)) { /* Both values overflowed and have the same sign, * so a numeric comparison would be inaccurate */ goto string_cmp; }
dval1 et dval2 sont les valeurs de deux chaînes converties respectivement en double. Mais pourquoi est-ce toujours le cas ?
Solution, utilisez trois signes égaux "===" au lieu de deux signes égaux "==", et la fonction in_array() définit le troisième paramètre sur true : in_array('val' , $array, vrai).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!