Quelques pièges du '==' en PHP

藏色散人
Libérer: 2023-04-07 14:40:01
avant
3164 Les gens l'ont consulté

PHP est un langage faiblement typé et effectuera automatiquement la conversion du type de données, ce qui apporte sans aucun doute une grande commodité à notre développement. Mais est-ce vraiment le cas ? Aujourd'hui, nous allons commencer par ==.

Exemple

Tout d'abord, jetez un œil à ce code. Devinez quel sera le résultat

<?php
var_dump(md5(&#39;240610708&#39;) == md5(&#39;QNKCDZO&#39;));
var_dump(md5(&#39;aabg7XSs&#39;) == md5(&#39;aabC9RqS&#39;));
var_dump(sha1(&#39;aaroZmOk&#39;) == sha1(&#39;aaK1STfY&#39;));
var_dump(sha1(&#39;aaO8zKZF&#39;) == sha1(&#39;aa3OFF9m&#39;));
var_dump(&#39;0010e2&#39; == &#39;1e3&#39;);
var_dump(&#39;0x1234Ab&#39; == &#39;1193131&#39;);
var_dump(&#39;0xABCdef&#39; == &#39; 0xABCdef&#39;);
var_dump(0 == &#39;abcdefg&#39;);
var_dump(1 == &#39;1abcdef&#39;);
?>
Copier après la connexion

À première vue, il est évident qu'ils sont tous faux, mais après avoir exécuté le code, j'ai découvert qu'ils étaient tous vrais !

WTF !

Pourquoi cela arrive-t-il ?

J'ai déjà dit au début que PHP est un langage faiblement typé. Lorsque vous utilisez == pour comparer deux variables, lorsqu'une variable est un entier, l'autre variable sera également convertie en entier. Cela explique également pourquoi 0 == 'abcdefg' et 1 == '1abcdef' sont vrais.

Mais qu'en est-il des autres codes ? Les chaînes peuvent-elles toujours être converties ?

Le manuel PHP nous fournit des explications.

Si vous comparez un nombre avec une chaîne ou si la comparaison implique des chaînes numériques, alors chaque chaîne est convertie en nombre et la comparaison est effectuée numériquement.

Autrement dit, si vous comparez deux chaînes impliquant nombres (par exemple : "0"), alors chaque chaîne sera convertie en nombre.

Ici, je dois dire : PHP est le meilleur langage !

Dangers

Lorsque notre site internet est directement crypté avec MD5 ou Sha1 sans sel, et qu'il arrive que le cryptage du mot de passe d'un utilisateur implique des chiffres, il peut être craqué par collision!

Solution

1. Évitez autant que possible d'utiliser == pour juger la valeur de deux variables pendant le processus de développement

2. Il est préférable d'utiliser le cryptage du mot de passe password_hash() ou salt md5($pwd.$salt)

Pour plus de connaissances sur PHP, veuillez visiter le Site Web PHP chinois !

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!

Étiquettes associées:
php
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal