Book


临近年关,可能大家都忙了些,因此虽然我们已经提前做了准备,并且遵守每双月 1 号发布一期杂志的承诺,按时发布了新一期的杂志,但在编辑部内部还是感觉匆忙了些,希望下一期能有所改观。

这一期的杂志并没有我的文章,我也不再负责每期《PHP 新闻》和《编者按》,而纯粹是作为一个《安全与优化》栏目的编辑出现,现在看来自我感觉做得还不够好。坦白说,这个栏目还没有做到我心目中所要达到的高度,今后还要多多努力。

相对于第一期,这一期杂志厚度略显薄了一些。不过单就页码数(本期为 69 页)而言,我认为比较合适的。太少自然说不过去,太多则编辑压力太大,而且限于目前国内 PHP 的应用现状也会有巧妇难做无米之炊的感觉。

关于本期的文章,限于个人兴趣,我主要说说这方面的几篇文章。

先来说说我负责栏目的几篇文章。得益于近水楼台,我最先翻阅的是 heiyeluren(黑夜路人)的《分表处理设计思想和实现》这篇文章。看得出,heiyeluren 应该是一名实际经验非常丰富的 PHP 程序员了。不过我并不想再次赘述文章的内容,而是想说一个看他的几篇文章所得出来的一个非常有趣的看法:他在文末所提出问题的价值通常都高于文章本身的平均价值。:D 我甚至觉得那几个问题才是文章的点睛之笔。

除这篇文章外,还有两篇关于安全方面的文章,分别是残恤的《编写安全的 PHP 代码》和剑心的《变量没有初始化引起安全漏洞》。这两篇文章作为我个人来讲,是有点言犹未尽的感觉的。在和作者交流时,作者似乎也有类似的感觉。这可能是我催稿也有点晚,使两位作者未有充分的时间去酝酿,来不及把自己的想法完全舒展开来的缘故,下次一定要记得改进。

存储过程、触发器和视图是构建大中型应用中不可避免地所使用的技术手段,这方面特性的缺乏也是 MySQL 被经常诟病的地方之一。所幸 MySQL 已经意识到了这个问题,在 5.x 版本中已经加入了对这方面的支持。但令人遗憾的是介绍 MySQL 存储过程等新特性的文章并不多,尤其是中文文章。本期 welefen 的《MySQL 中的存储过程、触发器和视图》一篇文章相信会对很多朋友有所帮助。

h058 的《JavaScript 效率测试》一文我也仔细的看了一遍。由于我对 JavaScript 的内部结构不太熟悉,所以也是感觉收获颇丰。

另外还有李辉的《Smarty 结合 ajax 无刷新留言本实例解析》、周路明的《PHPChina 留言本实例》系列连载教程都是很不错的技术文章,是刚进 PHP 大门朋友的一份很好的参考资料。

其他都是些非技术性文章,就不多说了,感兴趣的可以去看看,放松一下。:)

先祝贺《PHPer》发布创刊号!新生的事物总是孕育着无限希望,祝愿《PHPer》能够坚持办刊理念,成长为 PHP 中文杂志中的一朵奇葩~

《PHP&MORE》也是在“十月怀胎(这次可真的是十个月)”后终于发布了第七期。这一期她的专题是 LAMP 的优化。

这两本杂志各有不同的风格。《PHPer》主要面向初中级的 PHP 程序员,内容较为浅显。如果你对 PHP 准备入门或刚入门却不知怎么提高的话,那么这本杂志将会很适合您阅读。但这并非就是说整本杂志都是些入门级的文章,有些还是很有深度,值得进一步研究和探讨的。《PHP&MORE》基本上都是以专题的形式出现,阅读的对象相对专业一些。虽说有时出版周期过长,但所幸很多文章都值得长时间咀嚼。

光说没什么用,还是先下载下来看看吧~

查看《PHPer》创刊号

查看《PHP&MORE》第七期

btw:这两期杂志各有本人拙作一篇,欢迎砸砖,或者略去不看~:D

近日,关于如何加密 PHP 代码在 Exceed PHP 又被提起。但依我个人观点,作者可能对 PHP 的运行机制不太了解,因此所提出方案效果基本上可以说是聊胜于无。

获取 OPCode 有很多办法,也是很简单的事情,即使是加密过的 OPCode。稍微困难的是从 OPCode 还原成 PHP Code,这需要一种很好的逆向算法,但也并非不可实现。DeZend 就是一个公开的样例,更不要说还有很多半公开甚至不公开的了。 😀

我觉得对版权的保护分为两个层次:二进制级和源代码级。所谓二进制级就是不让用户非法使用未授权的程序。但这一点很难做到。想想看 windows 下面的软件都是经过编译和加壳保护,依然不能阻挡 Cracker 的脚步,更何况是半编译的 PHP Code。所谓源代码级保护是指不让非法用户获得产品的源代码。获得源代码的非法途径通常是对代码进行反编译。目前看来很难有有效的工具来阻止这项工作,即使是 windows 下面的程序也不能阻止(windows 下一般都是“反汇编”,这个名词严格意义上不同于“反编译”)。既然不能阻止反编译,那就只好退而求次,就像把 windows 程序反汇编后得到的很少人能读懂的汇编代码一样,让非法用户即使获得了 PHP 源代码也很难读懂它。这项工作主要通过“混淆”来完成。

“混淆”有一个很常见的分支是“变量混淆”。“变量混淆”的主要原理就是机器(或者说虚拟机)对一个变量(包括函数名、类名等等)究竟是叫 $hello_world 还是叫 $#@!**& 并不关心,那只是一个代号而已。目前大部分具有混淆功能的 Encoder 基本都集中在这个部分。

“混淆”的另外一个分支就是“指令混淆”。所谓“指令混淆”就是额外插入一些垃圾代码来干扰第三方正常阅读。比如我们可以把 $a = 0; 替换成
$d = 1;
$e = $d ^ $d;
$a = $e;

结果是一样的,但要是再复杂一些保证你不明白这是怎么回事。这可以说是一种“化简为繁”的工作,也会影响些效率。但随着机器硬件的不断发展,而且有些应用对运行效率要求并不高,所以这是可以接受的(更典型的例子就是 dotNET 上桌面程序)。

“混淆”还有一个主要的分支就是“流程混淆”。流程混淆可以说是“混淆”工作的必杀技,类似汇编语言中“花指令”。它所依据的原理就是源代码和中间代码并无一一的对应关系。比如说有个 if ($a) {$b} 的语句,并非可以只能编译成“先判断 $a 是否为 true,是就跳转到 $b”这一种形式。我可以先跳转到 $c,再跳转到 $d,$d 经过 $e 等一系列垃圾运算之后再跳转到 $b。效果是一样的,貌似你很明白,但其实上你就是不明白。 8)  PHP6 就要增加 goto 指令,这给各个 Encoder 的发挥空间也更大了。

目前在 Java 和 dotNET 上混淆工作大部分都集中在流程混淆上,但 PHP 方面目前大部分还停留在较初级的“变量混淆”上(ZendGuard 4 中的 Strong 级混淆也是属于“变量混淆”的范畴)。如果各位对 PHP 代码加密感兴趣,“混淆”尤其是“流程混淆”是一个很有意思的研究方向。当然反混淆是更有意思的一个方向。:)