2013-05-10 9 views
6

Considerate questo codice:CakePHP Test controller con il componente di protezione

Codice controller

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

Visualizza codice

<?php 

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

Dal momento che ho il componente di protezione in atto, manomissione con il modulo in qualsiasi modo (come aggiungere un campo ad esso) causerà la richiesta di essere nero-h oled. Mi piacerebbe provare questo:

test Codice

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

La seconda prova testExamplePostInvalidData dovrebbe fallire a causa di some_field essere nella matrice $data, ma passa! Che cosa sto facendo di sbagliato?

risposta

1

Aggiungendo 'some_field' nei dati di -> testAction, il componente di sicurezza assumerà che il campo sia parte della tua app (poiché proviene dal tuo codice, non da un array POST) quindi non verrà visto come un "tentativo di hacking".

Il controllo dei buchi neri è un po 'più contorto. Ma i test core di Cake già testano la funzionalità blackhole, quindi se quei test passano, non è necessario verificarlo nella tua app.

Se si insiste, però, controllare i test di base torta per l'orientamento:

In particolare:

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

Lotti altri esempi nel file:
https://github.com/cakephp/cakephp/blob/master/lib/Cake/Test/Case/Controller/Component/SecurityComponentTest.php

+0

Questa risposta mi ha fatto pensare di la possibilità di controllare semplicemente che cosa ritorna la vista su un GET e vedere se contiene campi che non dovrebbero essere modificabili. Quindi, sapendo che il componente Sicurezza è abilitato, so che sono al sicuro. Ma penso che il mio test abbia ancora senso perché ai test non interessa quale sia la tua implementazione; i test si preoccupano solo del risultato. Quindi il risultato della pubblicazione di campi che non dovrebbero essere modificabili dovrebbe comportare un errore, generato o meno dal componente Security (il test non interessa). Ma penso che questa risposta sia sufficiente. Grazie! – Nick

Problemi correlati