现在普遍的Nginx + PHP cgi的做法是在配置文件中, 通过正则匹配(Nginx(PHP/fastcgi)的PATH_INFO问题)设置SCRIPT_FILENAME, 今天小顿发现了一个这种方式的安全漏洞.
比如, 有http://www.laruence.com/fake.jpg, 那么通过构造如下的URL, 就可以看到fake.jpg的二进制内容:
http://www.laruence.com/fake.jpg/foo.php
为什么会这样呢?
左手代码右手诗
现在普遍的Nginx + PHP cgi的做法是在配置文件中, 通过正则匹配(Nginx(PHP/fastcgi)的PATH_INFO问题)设置SCRIPT_FILENAME, 今天小顿发现了一个这种方式的安全漏洞.
比如, 有http://www.laruence.com/fake.jpg, 那么通过构造如下的URL, 就可以看到fake.jpg的二进制内容:
http://www.laruence.com/fake.jpg/foo.php
为什么会这样呢?
在PHP4以前, PHP并不支持面向对象, 到PHP4的时候, PHP引入了一些OOP的关键字, 请注意我用的"关键字", 因为在PHP4中的对象, 不过就是一个数组(属性)加上一个函数数组(方法), 没有访问权限控制, 没有析构函数(当然可以模拟), 等等.
到PHP5以后, 随着Zend Engine 2的发布:
1. 访问权限控制 2. 接口的引入 3. 魔术方法(PHP4中可以通过overload来有限模拟) 4. 接口的应用 5. 内置接口 等等.
PHP5终于可以算是较完美的支持面向对象了.
而这些看似复杂的实现, 在根本上, 还是没有脱离属性数组+方法数组的基本, 接下来我就为大家揭开隐藏在源代码中的秘密.
在读别人代码的时候, 在没有详细文档的时候, 如何快速的看清整个代码的结构(类结构), 就成为了一个现实的问题.
今天我就介绍一种, 自动生成UML图的方法.
之前我对Javascript的原型链中, 原型继承与标识符查找有些迷惑,
如, 如下的代码:
function Foo() {}; var foo = new Foo(); Foo.prototype.label = "laruence"; alert(foo.label); //output: laruence alert(Foo.label);//output: undefined
在大型的Web项目中, include_path是一个模块化设计的根本中的根本(当然,现在也有很多基于autoload的设计, 这个不影响本文的探讨), 但是正是因为include_path, 经常会让我们遇到一些因为没有找到正确的文件而导致的看似"诡异"的问题.
也就有了如下的疑问:
include_path是怎么起作用的?
如果有多个include_path顺序是怎么样的?
什么情况下include_path不起作用?
一直使用putty(pietty), 因为简单,小巧.
但是, 一直也羡慕SecureCRT支持sz/rs进行file transfer, 很简单,,,很方便... 而小Putty就只能借助ftp或者winscp了....
今天发现了一个基于Putty的改进版Le Putty(项目地址:http://sourceforge.net/projects/leputty/), 可以完美的支持ZModem进行file transfer.
Vim是一种毒品,一旦你习惯之后就无法离开:),写Blog也是如此。以前用Vim写Blog是依赖Vimperator可以调出Vim进行编辑,不过今天发现了更简便、连游览器都不需要开的方法,那就是Vim的Blog插件:vimpress。vimpress支持获取文章列表并编辑修改文件、新建文章、现场保存,并支持文章分类、标签。
with 10 Commentsob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑...
其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情..
最近公司组织了个PHP安全编程的培训, 其中涉及到一部分关于Mysql的"SET NAMES"和mysql_set_charset (mysqli_set_charset)的内容:
说到, 尽量使用mysqli_set_charset而不是"SET NAMES", 当然, 这个内容在PHP手册中也有叙及, 但是却没有解释为什么.
最近有好几个朋友问我这个问题, 到底为什么?
问的人多了, 我也就觉得可以写篇blog, 专门介绍下这部分的内容了.