2013-05-10 27 views
6

xem xét mã này:CakePHP điều khiển thử nghiệm với các thành phần an ninh

điều khiển Mã

<?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); 
     } 
    } 
} 

Xem mã

<?php 

echo $this->Form->create(); 
echo $this->Form->input('name'); 
echo $this->Form->end('Submit'); 

Kể từ khi tôi có thành phần an ninh tại chỗ, giả mạo với biểu mẫu theo bất kỳ cách nào (chẳng hạn như thêm một trường vào nó) sẽ khiến yêu cầu trở thành đen-h oled. Tôi muốn thử nghiệm này:

Kiểm tra Mã

<?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']); 
    } 
} 

Các thử nghiệm thứ hai testExamplePostInvalidData nên thất bại vì some_field là trong mảng $data, nhưng nó đi! Tôi đang làm gì sai?

Trả lời

1

Bằng cách thêm 'some_field' vào dữ liệu của -> testAction, thành phần bảo mật sẽ giả định trường đó là một phần của ứng dụng của bạn (vì nó đến từ mã của bạn chứ không phải mảng POST). như một "nỗ lực hack".

Kiểm tra các lỗ đen phức tạp hơn một chút. Nhưng các thử nghiệm lõi Cake đã thử nghiệm chức năng lỗ đen, vì vậy nếu các kiểm tra đó vượt qua, bạn không cần phải kiểm tra nó trong ứng dụng của mình.

Nếu bạn nhấn mạnh mặc dù, hãy kiểm tra các xét nghiệm Bánh lõi để được hướng dẫn:

Cụ thể:

/** 
* 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'); 
} 

Lots nhiều ví dụ trong file:
https://github.com/cakephp/cakephp/blob/master/lib/Cake/Test/Case/Controller/Component/SecurityComponentTest.php

+0

Câu trả lời này khiến tôi nghĩ đến khả năng chỉ kiểm tra xem khung nhìn trả về GET và xem nó có chứa các trường không thể chỉnh sửa được không. Sau đó, khi biết rằng thành phần Bảo mật được bật, tôi biết rằng tôi an toàn. Nhưng tôi nghĩ rằng thử nghiệm của tôi vẫn có ý nghĩa bởi vì các thử nghiệm không quan tâm đến việc triển khai của bạn là gì; kiểm tra chỉ quan tâm đến kết quả. Vì vậy, kết quả của việc đăng các trường không nên chỉnh sửa sẽ dẫn đến lỗi, dù được tạo ra từ thành phần Bảo mật hay không (thử nghiệm không quan tâm). Nhưng tôi nghĩ rằng câu trả lời này đủ. Cảm ơn bạn! – Nick

Các vấn đề liên quan