考虑以下代码:
控制器代码
<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
public $components = array(
'Security',
'Session'
);
public function example() {
if ($this->request->is('post')) {
$this->set('some_var', true);
}
}
}
Run Code Online (Sandbox Code Playgroud)
查看代码
<?php
echo $this->Form->create();
echo $this->Form->input('name');
echo $this->Form->end('Submit');
Run Code Online (Sandbox Code Playgroud)
由于我有安全组件,以任何方式篡改表单(例如向其添加字段)将导致请求被黑洞.我想测试一下:
测试代码
<?php
class UsersControllerTest extends ControllerTestCase {
public function testExamplePostValidData() {
$this->Controller = $this->generate('Users', array(
'components' => array(
'Security'
)
));
$data = array(
'User' => array(
'name' => 'John Doe'
)
);
$this->testAction('/users/example', array('data' => $data, 'method' => 'post'));
$this->assertTrue($this->vars['some_var']);
}
public function testExamplePostInvalidData() {
$this->Controller = $this->generate('Users', array(
'components' => array(
'Security'
)
));
$data = array(
'User' => array(
'name' => 'John Doe',
'some_field' => 'The existence of this should cause the request to be black-holed.'
)
);
$this->testAction('/users/example', array('data' => $data, 'method' => 'post'));
$this->assertTrue($this->vars['some_var']);
}
}
Run Code Online (Sandbox Code Playgroud)
第二个测试testExamplePostInvalidData应该因为some_field在$data数组中而失败,但它会通过!我究竟做错了什么?
通过在 ->testAction 的数据中添加“some_field”,安全组件将假定该字段是您应用程序的一部分(因为它来自您的代码,而不是 POST 数组),因此它不会被视为“黑客”试图”。
检查黑洞有点复杂。但 Cake 核心测试已经测试了黑洞功能,因此如果这些测试通过,您无需在应用程序中检查它。
如果您坚持这样做,请查看核心 Cake 测试以获取指导:
具体来说:
/**
* test that validatePost fails if any of its required fields are missing.
*
* @return void
*/
public function testValidatePostFormHacking() {
$this->Controller->Security->startup($this->Controller);
$key = $this->Controller->params['_Token']['key'];
$unlocked = '';
$this->Controller->request->data = array(
'Model' => array('username' => 'nate', 'password' => 'foo', 'valid' => '0'),
'_Token' => compact('key', 'unlocked')
);
$result = $this->Controller->Security->validatePost($this->Controller);
$this->assertFalse($result, 'validatePost passed when fields were missing. %s');
}
Run Code Online (Sandbox Code Playgroud)