一些编程语言有 == 、 === 两种比较运算符,== 与 === 的区别是对值的比较上,具体行为取决于编程语言的设计,下文以PHP代码介绍。
当你想要比较两个值等于,但不考虑它们的类型,== 就很适合。
例如:
var x = 10;
var y = '10';
console.log(x == y) // true
console.log(x === y) // false
示例对比表(JavaScript):
| 表达式 | == 结果 |
=== 结果 |
原因 |
|---|---|---|---|
5 == "5" |
true |
false |
字符串转数字后比较 |
0 == false |
true |
false |
false 转 0 |
null == undefined |
true |
false |
特殊规则(仅 == 时相等) |
NaN == NaN |
false |
false |
NaN 不等于任何值(包括自身) |
双等和三等区别
定义:
== 只比较两个变量的值;
=== 比较两个变量的值、还有类型;
记忆 :
弱类型语言的=== 有可能是借鉴了数学符号全等 ≌ 、≡ 。
在java(强类型)中 == 就是全等了,因为用==比较不同类型的值时,直接报错了,并且无法执行!
风险:
在某些场景下, 由于双等判断只比较值,那么判断的变量有替换成别的类型也能true, 就会有绕过的风险。
编写代码时需要的考虑:
代码的表达式里如果使用了==比较操作符,表达式里某个变量如果来自外部输入,需要根据代码上下文判断是否有安全风险、绕过风险。
Example 1 — int 和 string 类型
<?php
header("Content-type: text/html; charset=utf-8");
$密码 = 000000;
$input = "000000"; # 外部输入的密码
if($密码==$input){
echo "密码正确!";
}else{
echo "密码错误!";
};
?>
out: 密码正确!
Example 2 — md5绕过
md5('240610708') == md5('QNKCDZO'); //True
md5('240610708') = = = md5('QNKCDZO'); //False
浙公网安备 33010602011771号