弱类型与强类型语言中“=”号的不同


声明:以下文字仅为个人观点,如有不正确的地方欢迎指正

0x01

在编程语言中的 “=“ 号不同于在数学上的 ”=“号,在数学中,x=5 与 5=x 是一个意思,可以等量替换,但在编程语言中,x=5与5=x 就不同了,后者会报错 因为这里的等号是赋值,且变量名不能为数字开头,我认为”=“号是一个人类伟大的发明.

0x02 强类型语言

我们(我)知道c语言是一门强类型语言,而诸如python,php等则是弱类型语言。何为强类型?就是在变量声明的时候就预先将其规定类型,如 int a=1;我们可以很清楚的知道a变量是一个数字整型,数值为1,在大部分编译器中占4个字节, char b='1';这时b变量则是字符型,占一个字节,为字符 ‘1’,对应的十进制ascll码为49,若 a==b 则返回 false ,在比较a和b时,比较的是ascll码值 数值1 与 字符1显然不相等
V1D`EDW~G8{XU66{A2))24H.png
XR2EXH%1I1(OK3D%KS}~69E.png

0x03 弱类型语言

在弱类型语言中,大部分时候我们都不太需要提前定义声明变量和类型 如在php中$x = 5;$y = '5' ; 在弱类型语言中 "==”与C语言有所不同的是他比较的不是ascll码,而是数值 如 x==y$x==$y 返回的均是true.

上面的 "==" 更侧重相等,例如两条狗长的一模一样,而且还一样可爱,那么我们就认为它们相等,但是外表上一样,性格,习惯等又不相同,这里则使用“===”三个等号做判断,意思是全等,完全一个模样刻出来的。
引用上面的x和y变量 这时 $x===$y 则返回的是 fasle ,优先比较两者的类型
666

0x04 引发的安全问题

在编程语言中科学计数法的表示为 数值e整数,如 5e5 = 5*10^5,若e的前面为0,则后面不论是什么则为0,而null==0 返回true。
这是一个很神奇的地方, 1234=='1234abc' //返回true 比较数字 若数字相等则abc被忽略
DGBZ7G$U$C%)CF}UETE1P(U.png
例如 :

<?php
md5('QNKCDZO')==md5('240610708'); //返回true
0==md5('QNKCDZO') ; //返回true
0==null; //返回true
md5(array()) //返回null 某些版本会报错

假如以下是某个程序的登录判断

<?php
$user = trim($_GET['user']);
$pwd = trim($_GET['pwd']);
$pwds = $db->query("select pwd from user where user = $user");//密码为 s214587387a
if(md5($pwd)==md5($pwds)){
echo '登录成功';
}else{
echo '登录失败';
}

所以绕过登录就很简单,通过构造参数以及数组则可绕过验证。

localhost/?user=admin&pwd[]=666

把两个等号换成三个等号就可以
这是一道ctf的简单题...

0x05 优势与劣势

毫无疑问,在弱类型语言下三个等号的判断条件更为严格,目前版本的更新也越来越重视强制类。
两个等号提供给了程序员更灵活的处理方法,相对应的也会带来安全隐患

Last modification:September 4, 2022
If you think my article is useful to you, please feel free to appreciate