我正在使用zend framework 1.12
。我有一个验证令牌的服务。服务有两个功能
setToken
:负责在会话中生成令牌和存储。 validateToken
:负责重新生成令牌并使用存储在会话中的令牌对其进行验证。目前的情况是我在加载表单时调用了setToken()
函数,并且在表单提交后将调用validateToken()
函数。
现在我要写zend custom validator
。这将完成所有这一过程。
这是我的自定义验证器:
class My_Validator_Csrf extends Zend_Validate_Abstract
{
const INVALID_TOKEN = 'invalid_token';
/**
* Message templates
* @var array
*/
protected $_messageTemplates = array(
self::INVALID_TOKEN => "csrf_form_error",
);
/**
* Generates and set token in session.
*/
public function __construct()
{
$request = Zend_Controller_Front::getInstance()->getRequest();
if (!$request->isPost()) {
$csrfValidator = new Website_Service_CsrfValidator();
$csrfValidator->setToken();
}
}
/**
* Validates csrf token.
*
* @return boolean
*/
public function isValid($value)
{
$csrfValidator = new Website_Service_CsrfValidator();
if (!$csrfValidator->validateToken()) {
$this->_error(self::INVALID_TOKEN);
return false;
}
return false;
}
}
问题:
必须在加载表单时调用setToken()
函数,而不是在表单提交后调用。因此,我正在检查方法是否不发布,为此我使用前端控制器在表单验证器中有请求对象。
$request = Zend_Controller_Front::getInstance()->getRequest();
if (!$request->isPost()) {
$csrfValidator = new Website_Service_CsrfValidator();
$csrfValidator->setToken();
}
我不确定这是否合法。如果没有,请建议我以另一种方式实现上述情况。
提前致谢
答案 0 :(得分:0)
你可以试试这个(注意:将'发送'改为你的提交按钮的id属性值):
if ($request->getParam('send', false)) { // user submitted form
...
} else { // form not yet submitted
...
}
另一种选择是将表单提交发布到不同的网址/操作。