Может любой говорить мне, где/как настроить маркерное сообщение об ошибке CSRF для форм в Symfony 1.4. Я использую sfDoctrineGuard для логинов и в этой форме особенно, каждый раз, когда сессия заканчивается, и у Вас все еще есть открытая страница, это бросает очень недружелюбную пользователем ошибку: "Нападение CSRF обнаруживается". Что-то как "Эта сессия истекло. Возвратитесь к домашней странице и попробуйте еще раз" звуки лучше.
Что правильный путь состоит в том, чтобы сделать это в классе формы?
Спасибо.
Единственный способ похоже, чтобы перезаписать sfForm :: addCSRFProtection ()
.
В /lib/form/BaseForm.class.php
вы можете добавить этот фрагмент кода:
class BaseForm extends sfFormSymfony
{
public function addCSRFProtection($secret = null)
{
parent::addCSRFProtection($secret);
if (array_key_exists(self::$CSRFFieldName, $this->getValidatorSchema())) {
$this->getValidator(self::$CSRFFieldName)->setMessage('csrf_attack', 'This session has expired. Please return to the home page and try again.');
}
}
}
После вызова родительского метода вы получаете валидатор, связанный с полем CSRF, и изменяете сообщение для кода csrf_attack
.
Изменить: Вам также необходимо проверить, существует ли валидатор. У некоторых форм может быть отключена защита от CSRF!
Надеюсь, это поможет!
В 1.4.4 мне пришлось измените код naag следующим образом ...
public function addCSRFProtection($secret = null)
{
parent::addCSRFProtection($secret);
if (isset($this->validatorSchema[self::$CSRFFieldName])) {
$this->validatorSchema[self::$CSRFFieldName]->setMessage('csrf_attack', 'This session has expired. Please refresh and try again.');
}
}
Это заработало, хотя бит 'csrf token:' все еще появляется в сообщении об ошибке.
Использовать диспетчер событий. Посмотрите это http://bluehorn.co.nz/2010/07/15/how-to-change-csrf-attack-message-in-symfony-1-2/
Я написал это для Symfony 1.2, но с использованием диспетчера событий, поэтому он все еще может работать для Symfony 1.4.