忙碌

Posted on 25th September 2007 by Nio in 创业, 工作忙碌

今天到建国门附近谈项目,响应“少开一天车”、“节能环保”的号召,我选择了地铁出行。这让我想起了半年前天天地铁上下班,走得也是这个路线。如今已经不再像从前那样忙碌了,取而代之的却是另一种忙碌。一种完全“为我”的忙碌,不再是为了老板 :)

本来想着谈完之后回 Crystal 看看的,可惜最后时间不够,只好作罢。

现在 BLOG 写得越来越少了,工作重心转移了?可能以前有比较多的闲时间吧,哈哈。

phpjobs.cn 还没上线,因为一直想让它非常简单实用,所以很多想法都被自己推翻了,慢慢来吧。

一岁9个月照片 ;)

Posted on 13th September 2007 by Nio in 宝宝, 日常生活

0.jpg

你的 CakePHP 应用安全吗?

Posted on 10th September 2007 by Nio in CakePHP, 程序人生

最近在写 CakePHP 网站的时候,发现一个 Cake 开发人员经常犯的错误,这个错误实际上会成为网站安全漏洞,使得网站很容易被攻击。

先来看如下代码,这是一个用户注册的 action,通常的写法是:


<?php
class UsersController extends AppController {
    
    //....
    
    function register() 
    {
        if (!empty($this->data)) {
            $this->User->create();
            if ($this->User->save()) {
                $this->redirect(array('action'=>'index'), nulltrue);
            } else {
                $this->Session->setFlash(__('Failed to register. Please, try again.'));
            }
        }
    }
    
    //....
    
}
?>

看起来这个代码片断很简单,很寻常,所以也很流行。但这个流行却让很多开发人员忽略了安全性问题。实际上我们并没有对表单提交过来的数据进行过滤,也就是说你可以通过客户端,给 $this->data 加入各种字段,只要这些字段名和数据表中的能够对上,都会被保存进数据库中。最致命的字段是什么?我们都知道,Cake 的表设计通常都有一个 'id' 字段,这也是为了方便快速编程而设计的默认表关键字。这个 id 就是最致命的字段。测试的方式很简单,通常我们可以通过 url 或者其它方式知道某个用户的 id,那么在注册的时候,使用 Firebug 编辑 HTML 表单,加入一个输入 id 的文本框:


<input type="text" name="data[User][id]" />

然后你就可以在表单中填入一个已存在的用户 id,如果你不知道任何用户的 id,那么可以试一下 1,通常前几个用户都是网站的相关人员的帐号,也极有可能拥有比普通用户更多的权限。其它注册项仍然照常填写,完成之后提交。接下来会发生什么呢?register() 方法把你的信息写入数据库了,但并不是创建一个新的用户,而是覆盖了你所填写的用户 id 所对应的那个用户,实际上你已经可以修改到那个用户的密码了。

想要修复这个问题,必须对 $this->data 进行过滤,至少要 unset($this->data['User']['id']); ,最保险的是把你真正需要的数据保存在一个数组里边,然后传给 $this->User->save(),如:


<?php
//....
if (!empty($this->data)) {
    $this->User->create();
    $data = array(
        'username' => $this->data['User']['username'],
        'password' => $this->data['User']['password'],
        //....
    );
    if ($this->User->save($data)) {
        $this->redirect(array('action'=>'index'), nulltrue);
    } else {
        $this->Session->setFlash(__('Failed to register. Please, try again.'));
    }
}
//....
?>

安全问题是最为重要的,不管你用什么框架,不管它有多方便,你都要去关注这方面的问题,不要被表面的“快速开发”所麻痹。

PHPUnit 支持的 group 测试

Posted on 4th September 2007 by Nio in Testing, 程序人生

via TestNG-style Grouping of Tests

PHPUnit 3.2 开始,支持像 TestNG 那样的 group 测试了,使用非常简单,只需要加上 @group 即可。


<?php
class TestTest extends PHPUnit_Framework_TestCase
{
    /**
     * @group a
     */
    public function testOne()
    {
    }
 
    /**
     * @group a
     * @group b
     */
    public function testTwo()
    {
    }
}
?>

使用 –group 选项运行 group 测试:


# phpunit --group a TestTest
PHPUnit 3.2.0-dev by Sebastian Bergmann.
..
Time: 0 seconds

OK (2 tests)

# phpunit --group b TestTest
PHPUnit 3.2.0-dev by Sebastian Bergmann.
.
Time: 0 seconds

OK (1 test)