- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈PHP弱类型安全-小飞
原原文文地地址址:/tips/4483
0x00 弱弱类类型型初初探探
没有人质疑php的简单强大,它提供了很多特性供开发者 用,其中一个就是弱类型机制。
在弱类型机制下 你能够执行这样的操作
#!php
?php
$var = 1;
$var = array();
$var = string;
?
php不会严格检验传入的变量类型,也可以将变量自由的转换类型。
比如 在$a == $b的比较中
$a = null; $b = false; //为真
$a = ; $b = 0; //同样为真
然而,php 内核的开发者原本是想让程序员借由这种不需要声明的体系,更加高效的开发,所以在几几乎乎所所有有内内置置函函数数以以
及及基基本本结结构构中 用了很多松散的比较和转换,防止程序中的变量因为程序员的不规范而频繁的报错,然而这却带来了安
全问题。
0x02 知知识识预预备备 php 内内核核之之zval结结构构
在PHP中声明的变量,在ZE中都是用结构体zval来保存的
zval的定义在zend/zend.h
#!c
typedef struct _zva _struct zva ;
struct _zva _struct {
/* Variab e information */
zva ue_va ue va ue; /* va ue */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
typedef union _zva ue_va ue {
ong va ; /* ong va ue */
doub e dva ; /* doub e va ue */
struct {
char *va ;
int en;
} str;
HashTab e *ht; /* hash tab e va ue */
zend_object_va ue obj;
} zva ue_va ue;
其中php通过type判断变量类型 存入value
如上也就是php 内核中弱类型的封装,也是我们后面讲的所有东西的原理和基础。
0x03变变量量的的强强制制转转换换
通过刚刚的了解,我们知道zval.type决定了存储到zval.value的类型。
当源代码进行一些未限制类型的比较,或数学运算的时候,可能会导致zval.type的改变,同时影响zval.value的内容改变。
当当int遇遇上上string
cp.1 数数学学运运算算
当php进行一些数学计算的时候
#!php
var_dump (0 == 0); // true
var_dump (0 == abcdefg); // true
var_dump (0 === abcdefg); // fa se
var_dump (1 == 1abcdef); // true
当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
相当于对字符串部分
intval再和整数部分比较,其实也就是改变了zval.type的内容 尤为注意的是,1assd的转换后的值是1,而‘asdaf 是0
也说明了intval会从第一位不是数字的单位开始进行
所有也有
#!php
var_dump (intva (3389a));//输出3389
这个例子就告诉我们,永远不要相信下面的代码
#!php
if($a1000){
mysq _query(update ... set va ue=$a)
}
你以为这时候进入该支的万无一失为整数了
其实$a可能是1001/**/union...
cp.2 语语句句条条件件的的松松散散判判断断
举个例子
php的switch 用了松散比较. $which会被自动intval变成0
如果每个case里面没有break ,就会一直执行到包含,最终执行到我们需要的函数,这里是成功包含
#!php
?php
if (isset($_GET[which]))
{
$which = $_GET[which];
switch ($which)
{
case 0:
c
文档评论(0)