Kapitola 10 z 15
Formuláře, validace a CSRF.
Ověřte vstup jednou, escapujte výstup a zapisující HTTP požadavky chraňte synchronizačním tokenem.
Validace vstupu
Injektujte FormValidation, získejte pole z parsed body a sestavte malé schéma. Po validate() pracujte s isValid(), errors() a validated().
Form validation
<?php
$payload = is_array($request->getParsedBody()) ? $request->getParsedBody() : [];
$result = $this->validator
->field('email', 'E-mail')
->required()
->email()
->maxLength(150)
->field('message', 'Message')
->required()
->maxLength(5000)
->validate($payload);
if (!$result->isValid()) {
return $this->responses->json(['errors' => $result->errors()], 422);
}Fluent schema se po validaci resetuje. Opakovanou validační logiku přesuňte do aplikační služby nebo explicitního ValidationSchema.
CSRF ochrana
Na zapisující routu připojte CsrfMiddleware. HTML formulář vloží token přes $this->csrfField(); pro AJAX použijte hlavičku X-CSRF-Token.
Route and view
<?php
use Lemonade\Framework\Security\Csrf\CsrfMiddleware;
$router
->postNamed('contact.store', '/contact', ControllerAction::for(ContactController::class, 'store'))
->middleware(CsrfMiddleware::class);
?>
<form method="post" action="<?= e($this->url('contact.store')) ?>">
<?= $this->csrfField() ?>
<button type="submit">Send</button>
</form>Neplatný token vrátí 419 a controller se nespustí. Token neposílejte v query stringu.