Heim  >  Artikel  >  Backend-Entwicklung  >  Einige Fallstricke von „==“ in PHP

Einige Fallstricke von „==“ in PHP

藏色散人
藏色散人nach vorne
2019-10-11 13:13:393091Durchsuche

PHP ist eine schwach typisierte Sprache und führt automatisch eine Datentypkonvertierung durch, was unserer Entwicklung zweifellos große Erleichterung bringt. Aber ist das wirklich so? Heute beginnen wir mit ==.

Beispiel

Schauen Sie sich zunächst diesen Code an. Ratet mal, was das Ergebnis sein wird

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

Auf den ersten Blick ist es offensichtlich, dass sie alle falsch sind, aber nachdem ich den Code ausgeführt habe, habe ich festgestellt, dass sie alle wahr sind!

WTF!

Warum passiert das?

Ich habe bereits zu Beginn gesagt, dass PHP eine schwach typisierte Sprache ist. Wenn Sie == zum Vergleichen zweier Variablen verwenden und eine Variable eine Ganzzahl ist, wird die andere Variable ebenfalls in eine Ganzzahl konvertiert. Dies erklärt auch, warum 0 == 'abcdefg' und 1 == '1abcdef' wahr sind.

Aber was ist mit den anderen Codes? Können Strings trotzdem konvertiert werden?

Das PHP-Handbuch liefert uns Erklärungen.

Wenn Sie eine Zahl mit einer Zeichenfolge vergleichen oder der Vergleich numerische Zeichenfolgen umfasst, wird jede Zeichenfolge in eine Zahl umgewandelt und der Vergleich numerisch durchgeführt.

Das heißt, wenn Sie zwei Zeichenfolgen vergleichen Zahlen (z. B. „0“), dann wird jede Zeichenfolge in eine Zahl umgewandelt.

Hier muss ich sagen: PHP ist die beste Sprache!

Gefahren

Wenn unsere Website direkt mit MD5 oder Sha1 ohne Salt verschlüsselt ist und es vorkommt, dass die Verschlüsselung des Passworts eines Benutzers Zahlen beinhaltet, kann es von geknackt werden Kollision!

Lösung

1. Vermeiden Sie die Verwendung von == während des Entwicklungsprozesses so weit wie möglich.

Es ist so Verwenden Sie am besten die Passwortverschlüsselung „password_hash()“ oder „salt md5($pwd.$salt)“

Weitere PHP-Kenntnisse finden Sie auf der PHP-Chinese-Website!

Das obige ist der detaillierte Inhalt vonEinige Fallstricke von „==“ in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen