Nessuna di queste risposte spiega come rimuovere l'etichetta "Token CSRF:" che prefigura il messaggio di errore in un modo non hacker (ad esempio la modifica del nome del token è una cattiva idea!).
L'unico modo valido per rimuovere l'etichetta è estendere il validatore CSRF per generare un errore globale. Mentre lo facciamo, possiamo anche cambiare il messaggio di errore.
class myValidatorCSRFToken extends sfValidatorCSRFToken
{
protected function configure($options = array(), $messages = array())
{
parent::configure($options, $messages);
$this->addMessage('csrf_attack', 'Your session has expired. Please return to the home page and try again.');
}
protected function doClean($value)
{
try {
return parent::doClean($value);
} catch (sfValidatorError $e) {
throw new sfValidatorErrorSchema($this, array($e));
}
}
}
Ora, cerchiamo di impostare i nostri moduli di usare questo validatore sovrascrivendo sfForm::addCSRFProtection
in BaseForm
:
public function addCSRFProtection($secret = null)
{
parent::addCSRFProtection($secret);
if (isset($this->validatorSchema[self::$CSRFFieldName])) //addCSRFProtection doesn't always add a validator
{
$this->validatorSchema[self::$CSRFFieldName] = new myValidatorCSRFToken(array(
'token' => $this->validatorSchema[self::$CSRFFieldName]->getOption('token')
));
}
}
fonte
2011-04-22 18:39:50
@naag: grazie mille. Ho provato un paio di cose, ma non quello, avrò un gioco. Sembra una piccola svista dai ragazzi di symfony. – Tom
Ho modificato la mia risposta per includere un controllo dell'esistenza del validatore CSRF :-) – naag