PHP弱类型

来自三线的随记
可打印版不再被支持且可能有渲染错误。请更新您的浏览器书签并改用浏览器默认的打印功能。

0x01 前言

php弱类型以及绕过方式

0x02 知识介绍

php中有两种比较的符号 == 与 ===

<?php
$a == $b;
$a===$b;
?>

=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较

== 在进行比较的时候,会先将字符串类型转化成相同,再比较

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行

这里明确说明如果一个数值和字符串进行比较的时候,会将字符串转换成数值

当一个字符串当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整形的范围之内
该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0

参考利用数值

var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));

MD5

QNKCDZO

0e830400451993494058024219903391

s878926199a

0e545993274517709034328855841020  

s155964671a

0e342768416822451524974117254469  

s214587387a

0e848240448830537924465865611904  

s214587387a

0e848240448830537924465865611904  

s878926199a

0e545993274517709034328855841020  

s1091221200a

0e940624217856561557816327384675  

s1885207154a

0e509367213418206700842008763514