CakePHP中文手册【翻译】-安全组件

安全组件

1

介绍

安全组件用来保护你的controller动作不遭到恶意的或错误的请求攻击。它允许你创建某些条件,可以在这些条件下请求一个动作,而且有时候指定了如何处理那些不符合需求的请求。在使用安全组件之前,你必须确保‘Security'在你的Controller$components数组中。

2

保护Controller动作

安全组件包含了2个主要方法来限制访问controller动作:

requirePost

  • string $action1
  • string $action2
  • string $action3...

为了执行指定的动作,他们必须是POST请求。

requireAuth

  • string $action1
  • string $action2
  • string $action3...

确保一个请求来自于应用程序,它通过检验一个在已POST的表单数据中的身份验证键,此键已经存储在用户的session里。如果身份匹配,允许动作执行。即使这样,但还是请注意,由于灵活性原因,如果表单数据实际上已经post,本检验才运行。如果通过一个常规的GET请求调用动作,requireAuth()什么事情也不做。出于最高安全考虑,你应该对你想完全保护的动作使用requirePost()和requireAuth()方法。为了得到更多关于身份验证键是如何产生的,并且它是如何结束的,参看下面的第4节。

但是,首先让我们看看一个简单的例子:

class ThingsController extends AppController

{

    var $components = array('Security');

 

    function beforeFilter()

    {

        $this->Security->requirePost('delete');

    }

 

    function delete($id)

    {

        // This will only happen if the action is called via an HTTP POST request

        $this->Thing->del($id);

    }

}

在这里,我们告诉安全组件'delete'动作需要一个POST请求。beforeFilter()方法常常用在你想告诉安全(以及大多数其他组件)它们自己做什么的地方。然后在beforeFilter()调用之前,它会按告诉它的去完成。但是在调用动作本身之前也一样。

就是这些。你可以在你的浏览器里输入动作的URL,看看发生了什么,这样就可以测试它了。.

3

处理无效的请求

因此,如果一个请求不符合我们定义的安全需求,会发生什么呢?缺省的,请求会是一个黑洞,意思是说会给客户端发送一个404消息头,而且应用程序会立刻退出。即便如此,安全组件有一个$blackHoleCallback属性,你可以将这个属性设置为一个controller里定义的自定义回调函数名。

既然不是简单给出一个404消息头和什么都没有,此属性允许你完成一些请求的额外检验,并将请求转向到其他地方,甚至记录非法客户端的IP地址。即便如此,如果你选择使用一个自定义回调而且请求无效的话,你有责任退出应用程序。如果你的回调返回true,安全组件会继续根据其他定义的需求来检验请求。否则,他将停止检验,并且应用程序仍然不受约束。

4

高级的请求身份验证

requireAuth()方法允许非常详细的指明如何并且在那里访问一个动作,但是它有某些特定的使用限制,当你理解本身份验证方法是如何工作的,你就清楚了。正如上面描述的,requireAuth()会将一个在POST数据中的身份验证键与一个存储在用户session数据中的那个相比较。因此,安全组件必须包含在controller接收请求中,也必须包含在controller创建请求里。

例如,如果有一个动作在PostsController里,而且此Controller伴有一个包含POST到一个CommentsController的动作的表单的view,那么安全组件必须包含在CommentsController(它正接收请求,而且实际上保护动作)中,也必须包含在PostsController(从这里创建请求)中。

每次加载安全组件时,虽然它不会用来保护一个动作,但是它会做下面的事情:首先,它使用核心的Security类生成一个身份验证键,然后,将此键写入session,同时也有过期时间,以及某些其他的信息(过期时间由/app/config/core.php的设置决定)。接着,在你的Controller里设置该键,供后面引用。

view文件里,使用$html->formTag()生成的任何表单标签也都会包含一个带有身份验证的隐藏的输入字段。按这种方法,当POST表单之后,在接收请求末尾时安全组件将此值和session里的值做比较。随之,会再次生成身份验证键,而且下一次请求时更新session

Change History:
  • Last Updated:2006年12月5日
posted @ 2006-11-30 09:53  张太国  阅读(...)  评论(...编辑  收藏