一些编程语言有 == 、 ===之类的比较运算符,== 与 === 的区别主要体现在 值的比较逻辑 上,具体行为取决于编程语言的设计。

当你想要比较两个值等于不考虑它们的类型,== 就很适合。

例如:

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
posted on 2021-02-25 16:18  Mysticbinary  阅读(215)  评论(2)    收藏  举报