在CTF竞赛中PHP弱类型的特性常常被用上,但咱们往往知其然不知其所以然,终究为什么PHP是弱类型呢?很少人深究。在这次源码剖析的过程中我收成很大,之一次学会了怎么深化了解一个问题,尽管花费了我许多时刻,但这能够说是一段十分值得的阅历。
正文
首要引进一个问题,为什么以下结果是恒为真的呢?
var_dump([]>1);
var_dump([]>0);
var_dump([]>-1);
当然实践ctf中问题可能会如下
$_GET[Password]>99999;
当传入Password[]=1
时侯恒为真
当然再换一种办法
var_dump([[]]>[1]);
仍旧是恒为真
关于这类问题,许多人都是以为PHP由于它是弱类型言语它就有这种特性
那么为什么PHP会有这种特性呢?
咱们首要查阅下PHP手册
http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.types
在手册中写到,当array和anything进行比较的时分array is always greater
这是一种PHP的界说。
那么终究PHP终究在哪界说了这种特色呢?
咱们仍旧不知道。
咱们再抛出个问题终究什么是PHP弱类型呢?
许多人可能会答复弱类型便是弱类型,当传入Password[]=1就会绕过这便是弱类型
这种答复肯定是不稳当的
具体弱类型界说
PHP是弱类型言语,不需求清晰的界说变量的类型,变量的类型依据运用时的上下文所决议,也便是变量会依据不同表达式所需求的类型主动转化,比方求和,PHP会将两个相加的值转为long、double再进行加和。每种类型转为别的一种类型都有固定的规矩,当某个操作发现类型不符时就会依照这个规矩进行转化,这个规矩正是弱类型完结的根底。
咱们再经过查阅PHP源码来深刻了解PHP弱类型的特色
PHP是开源的一种言语,咱们在Github上能够很简略的查询到它的源码
传送门
这儿找函数会便利点
当然解说下什么是Zend
Zend是PHP言语完结的最为重要的部分,是PHP最根底、最中心的部分,它的源码在/Zend目录下,PHP代码从编译到履行都是由Zend完结的
至于为什么要查询zend_operators.h这个文件,operator操作符,其他几个文件不像存在比较函数,有的时分查源码时分便是需求靠感觉,这种大项目 函数变量什么的都有标准 一般所见即所得 看懂英语就大约猜得到用处的,
当然这个文件也不一般
我再进行解说下,当然想深化了解能够看这儿
PHP在内核中是经过zval这个结构体来存储变量的,它的界说在Zend/zend.h文件里,简略精粹,只要四个成员组成:
咱们定位到函数
ZEND_API int ZEND_FASTCALL is_ *** aller_function(zval result, zval op1, zval *op2);
这儿传入了两个值op1,op2,传出一个result
解说下zval类型
zval以一个P完毕的宏的参数大多是zval型变量。 此外获取变量类型的宏还有两个,分别是Z_TYPE和Z_TYPE_PP,前者的参数是zval型,而后者的参数则是*zval。
这样说可能会有些笼统
咱们换种办法解说,当再php源码中要想判别一个变量的类型最直接的办法,比方想判别这个变量是否为空
变量->type == IS_NULL
这种办法尽管是正确的,但PHP官网并不主张这么做,PHP中界说了很多的宏,供咱们检测、操作变量运用
解说下什么是宏
C言语中答应用一个标识符来标识一个字符串,称为“宏”;标识符为“宏名”。在编译预处理时,对程序中所有呈现的“宏名”,都用宏界说时的字符串去代换,简称“宏代换”或“宏打开”。一般办法:#define 宏名 字符串
宏界说阐明及留意:
宏界说时用宏名来表明一个字符串,在宏打开时又以该字符串替换了宏名,这仅仅一个简略的替换;宏界说不需求再行末加分号,若加上分号,则会连分号也会被替换的;宏界说必须在函数外面;宏界说的效果域:从界说指令至程序完毕,若想停止宏的效果域,则运用undef指令;宏名在程序顶用引号括起来,则预处理程序对其不进行宏替换;宏界说是能够嵌套运用的,在打开时,由预处理程序层层替换;主张在进行宏界说时,尽量运用大写字母表明宏名;可用宏来表明数据类型,使书写便利;对“输出格局”做用界说,能够削减书写费事。
PHP主张运用的办法
Z_TYPE_P(变量) == IS_NULL
以一个P完毕的宏的参数大多是zval型变量。 此外获取变量类型的宏还有两个,分别是Z_TYPE和Z_TYPE_PP,前者的参数是zval型,而后者的参数则是*zval
这样咱们便能够猜想一下php内核是怎么完结gettype这个函数了,代码如下:想要具体了解的能够看这儿
//开端界说php言语中的函数gettype
PHP_FUNCTION(gettype)
{
//arg直接指向调用gettype函数时所传递的参数。是一个zval**结构
//所以咱们要对他运用__PP后缀的宏。
zval **arg;
//这个if的操作主要是让arg指向参数~
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) {
return;
}
//调用Z_TYPE_PP宏来获取arg指向zval的类型。
//然后是一个switch结构,RETVAL_STRING宏代表这gettype函数回来的字符串类型的值
switch (Z_TYPE_PP(arg)) {
case IS_NULL:
RETVAL_STRING("NULL", 1);
break;
case IS_BOOL:
RETVAL_STRING("boolean", 1);
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 黑客接单网
支撑· 英国政府也面对加密钱银相关的问题,包含英国信息专员办公室(ICO)、学生赞助公司(SLC)、苏格兰国家卫生服务局在内的政府服务网站都被经过有缝隙的第三方插件感染了加密钱银挖矿歹意软件。 这四种...
我测试的跑了20次的结果:* Listen case. But it's never safe to do it in the case where there's影响范围2、2019年5月15日被朋...
「外国黑客接单_如何找黑客查看老婆微信聊天记录-黑客找qq的视频下载」0x020100 SPI接口界说Spider(蜘蛛)——运用智能感应的网络爬虫,它能完好的枚举运用程序的内容和功用。...
图7 CVE-2019-8651代码 2019年山东区域第三季度管帐从业.exe -c指定要写入字典文件中的行数,只在有-oSTART参数时才收效,单个字典...
4种日志记载内容比照有一点我应该在这里明确指出,你并需求将这个字节直接增加到ArrayBuffer中。 由于ArrayBuffer自身并不知道字节应该有多大,或许不同的数字应该怎么转换成字节。 怎么翻...
真正的网络黑客不会出现在日常生活中,日常生活中的网络黑客大多数是普通程序猿,虽然他们是散漫的,但他们大多数是柔和典型性的理工科学生,他们平时也可能在某个大型的公司里上班,比如像华为或瑞星这样的做系统软...