浅谈PHP弱类型安全-小飞.PDFVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

2105194781 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档