Maison  >  Article  >  développement back-end  >  Quelques pièges du "==" en PHP

Quelques pièges du "==" en PHP

藏色散人
藏色散人avant
2019-10-11 13:13:393091parcourir

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;);
?>

À 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer