Как CSRF обеспечить форму, которая отправляет на другую страницу? - PullRequest
0 голосов
/ 18 августа 2011

У меня есть небольшая проблема, касающаяся безопасности CSRF и формы входа.Форма работает следующим образом:

В основном макете помощник вида создает форму входа в систему и позже также отображает пользовательское меню, когда пользователь прошел аутентификацию.

    // User menu viewhelper
public function authentication()
{
    // Check if user is authenticated or not
    $auth = Zend_Auth::getInstance();

    if(!$auth->hasIdentity())
    {
        $form = new Application_Form_Login();
        $form->setAction($this->_view->url(array('action' => 'login'), 'ucp', true));

        return $form;
    }
    else
    {
        // return user specific menu
    }
}

Формаотправляет сообщения в UcpController, содержащий всю логику панели управления пользователя, такую ​​как вход / выход и отображение специфической информации пользователя.

    // loginAction in UcpController
public function loginAction()
{
    if(Zend_Auth::getInstance()->hasIdentity())
    {
        $this->_redirect('/');
        return;
    }

    $request = $this->getRequest();

    $form = new Application_Form_Login();

    if($request->isPost())
    {
        if($form->isValid($post = $request->getPost()))
        {
            // Do authentication stuff here.
        }
    }

    $this->view->form = $form;
}

К сожалению, этот токен CSRF не совпадает, и я не знаю, как решитьЭта проблема.Я что-то здесь упускаю?Должен ли я удалить проверку CSRF все вместе?

// The CSRF protection element as added to the login form
$this->addElement('hash', 'csrf',
    array(
        'ignore' => true
    )
);

Заранее спасибо, ваша помощь очень ценится:)

Ответы [ 2 ]

0 голосов
/ 19 августа 2011

Проблема решена!Я столкнулся с кем-то, кто столкнулся с той же проблемой.Причина очень странная: http://tinyurl.com/3fkg8bk (ZF Forums).

Как выяснилось, моя иконка возвращала код HTTP 500, поскольку файл не существовал.Это, очевидно, запускает новый CSRF для генерации.Я не имею ни малейшего понятия, почему, но это решило мою проблему, создав иконку и загрузив ее в веб-корень.

Спасибо, что подумали вместе со мной!

0 голосов
/ 19 августа 2011

Ваш код кажется правильным, я думаю, что проблема может быть где-то еще. Для устранения этой проблемы сделайте это:

Используя firebug, проверьте сгенерированный Application_Form_Login, особенно токен CSRF, затем, когда вы публикуете данные, попробуйте Zend_Debug::dump массив $_SESSION и $_POST в вашем loginAction и сравните результат. Вы должны найти соответствие между опубликованными данными и данными сеанса.

Вам необходимо найти совпадение между отправленной почтовой переменной и переменной сеанса с именем Zend_Form_Element_Hash_salt_<name-of-your-element>, если значения совпадают, то ошибка в другом месте, и вы должны вывести $form->getMessages(), чтобы найти ее.

Как указал zerkms в комментарии, мое предыдущее предложение неверно. Я посмотрел на реализацию и увидел, что токен CSRF в ZF меняется раз в 300 секунд, с этим таймаутом истечение срока действия токена не должно быть проблемой в вашем случае.

...