昨天在Yaf交流群, 大草原同学批评我变懒了, Blog很久没更新了, 今天刚好有人在Segmentfalut上问了我一个问题, 我在微博上也做了简单的解答, 不过感觉一句话说不清楚, 就写篇blog凑个数吧. 😉
问题在这里, 因为太长, 我就不copy过来了: 这是php中__call和__callStatic在被继承后会产生的bug?
这个问题乍看, 确实很容易让人迷惑, 但实际上, 造成这样的误解的根本原因在于: 在PHP中, 判断静态与否不是靠"::"(PAAMAYIM_NEKUDOTAYIM)符号, 而是靠calling scope.
那么, 什么是calling scope?
一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.
但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载.
PHP在之前把源代码迁移到了git下管理, 同时也在github(https://github.com/php/php-src)上做了镜像, 这样一来, 就方便了更多的开发者为PHP来贡献代码.
今天写这篇文章, 就是为了给在国内的同学们, 愿意为PHP开源社区做贡献的同学们, 做个示例, 如何为PHP来贡献你的智慧.
今天是愚人节, 但我这个文章标题可不是和大家开玩笑. 🙂
首先, 大家都知道, PHP也是一种编译型脚本语言, 和其他的预编译型语言不同, 它不是编译成中间代码, 然后发布.. 而是每次运行都需要编译..
为此, 也就有了一些Opcode Cache, 比如APC, 比如eacc. 还有Zend O+.
那么为什么PHP不把编译/执行分开呢?
最近几天忙里偷闲, 一直在完善taint, 今天我觉得终于算做到了80%的满意了, 根据80:20原则, 我觉得可以做为一个里程碑的版本了 :).
什么是Taint? An extension used for detecting XSS codes(tainted string), And also can be used to spot sql injection vulnerabilities, shell inject, etc.
经过我实际测试, Taint-0.3.0能检测出实际的一些开源产品的(别问是什么)隐藏的XSS code, SQL注入, Shell注入等漏洞, 并且这些漏洞如果要用静态分析工具去排查, 将会非常困难, 比如对于如下的例子:
<?php $name = $_GET["name"]; $value = strval($_GET["tainted"]); echo $$name;
对于请求:
http://****.com/?name=value&tainted=xxx
静态分析工具, 往往无能为力, 而Taint却可以准确无误的爆出这类型问题.
with 71 Comments之前, 小顿和我提过一个想法, 就是从PHP语言层面去分析,找出一些可能的注入漏洞代码. 当时我一来没时间, 而来也确实不知道从何处下手..
直到上周的时候, 我看到了这个RFC: RFC:Taint.
但是这个RFC的问题在于, 它需要为PHP打Patch, 修改了PHP本身的数据结构, 这对于以后维护, 升级PHP来说, 很不方便, 也会有一些隐患.
虽然这样, 但这个RFC却给了我一个启发, 于是我就完成了这样的一个扩展:Taint Extension
还记得我之前说的PHP Hash Collisions Ddos漏洞吧? 最初的时候, 开发组给出的修复方案, 采用的是如果超过max_input_vars, 就报错(E_ERROR), 继而导致PHP出错结束. 而后来, 为了更加轻量级的解决这个问题, 我们又改善了一下, 变成了如果超过max_input_vars, 就发出警告(E_WARNING), 并且不再往目的数组添加, 但是流程继续. 然后我们发布了5.3.9.
这个新的修复方法初衷是好的, 但是却带来一个严重的问题(5.3.10中已经修复), 这个问题最初是由Stefan Esser发现的. 请看之前(5.3.9)最终的修复方案(php_register_variable_ex):
先说个题外话: 在公司做了俩件事, 是我觉得很有意义的, 第一就是成立了一个PHP邮件组, 第二就是成立了一个Hi群. 目前俩者都有超过500 phpers在里面. 我一直认为, 构建一个交流平台, 让同学们能顺畅, 简单的沟通, 是营造积极的技术学习氛围的基础和前提. 让每个人的问题不会成为别人的问题, 则是最直接的利益.
昨天, 有同事在邮件组提了个问题:
PHP应该什么时候使用 Exception ? 它的性能如何?
这个问题也算是一个久经争论的经典问题了. 我谈谈我的个人看法.
with 38 Comments今天有人在微博上问了一个问题, 使用:
string exec ( string $command [, array &$output [, int &$return_var ]] )
调用一个程序, 程序退出-1, 但是PHP得到的为什么是255?
写博客3年了, 也借此认识了不少朋友.
到今天, 博客的google订阅数3,870, 那就祝愿所有订阅我博客的同学们, 身体永远健康, 所有不经意来到我博客的同学们, 身体比较健康!!
龙年大吉.
thanks