joe*_*von 6 phpunit zend-framework csrf zend-form
我正在使用带有Zend_Form的CSRF隐藏哈希元素并尝试单元测试登录但不知道如何编写单元测试以包含该元素.查看文档并阅读尽可能多的教程.我甚至都把它们全都搞熟了,但没有人提到这一点.
每次呈现表单时都会生成Csrf值.表单的隐藏元素预先填充该值.该值也存储在会话中.提交表单后,验证检查表单中发布的值是否存储在会话中,否则验证失败.至关重要的是,表单必须在测试期间呈现(因此它可以生成隐藏值并将其存储到会话中),然后我们可以从渲染的html中提取隐藏的值,稍后我们可以将隐藏的哈希值添加到我们的要求.考虑这个例子:
function testAddPageStoreValidData()
{
// render the page with form
$this->dispatch('/form-page');
// fetch content of the page
$html = $this->getResponse()->getBody();
// parse page content, find the hash value prefilled to the hidden element
$dom = new Zend_Dom_Query($html);
$csrf = $dom->query('#csrf')->current()->getAttribute('value');
// reset tester for one more request
$this->resetRequest()
->resetResponse();
// now include $csrf value parsed from form, to the next request
$this->request->setMethod('POST')
->setPost(array('title'=>'MyNewTitle',
'body'=>'Body',
'csrf'=>$csrf));
$this->dispatch('/form-page');
// ...
}
Run Code Online (Sandbox Code Playgroud)
正确的散列存储在会话中,并且 Hash 表单元素有一个 Zend_Session_Namespace 实例,其中包含散列的命名空间。
要对元素进行单元测试,您可以将元素中的 Zend_Session_Namespace 实例(使用 setSession)替换为您自己创建的包含正确哈希值的实例(哈希值存储在键“hash”中)
有关更多示例,您可以查看 Zend_Form_Element_Hash 类的 Zend Framework 单元测试。我认为他们也必须处理这个问题。