CSRF é unha actividade maliciosa realizada por un atacante, que realiza accións en nome dun usuario autenticado, prexudiciais para a seguridade web. Afortunadamente, Laravel proporciona as ferramentas para previr este tipo de vulnerabilidades.
Os ataques CSRF secuestran as sesións dos usuarios. Fano enganando a un usuario para que envíe unha solicitude a través de etiquetas de formularios ocultas ou URL maliciosos (imaxes ou ligazóns) sen o coñecemento do usuario.
Este ataque leva a un cambio no estado da sesión do usuario, fugas de datos e, ás veces, os hackers poden manipular os datos do usuario final nunha aplicación.
A imaxe anterior ilustra un escenario onde se infringe a seguridade web. A vítima envía unha solicitude facendo clic nunha ligazón (recibida), enviando unha solicitude a un servidor do sitio web que producirá os efectos desexados polo hacker, quen entra en posesión da información útil para acceder e manipular o servidor do sitio web.
Para mellorar o seguridade web das súas aplicacións, en cada sesión de usuario, Laravel xera tokens seguros que utiliza para garantir que o usuario autenticado é o que solicita a aplicación.
Dado que este token cambia cada vez que se rexenera unha sesión de usuario, un atacante non pode acceder a el.
Sempre que hai unha solicitude para cambiar a información do usuario no lado do servidor (backend), como POST
, PUT
, PATCH
e DELETE
, debe incluír a directiva @csrf
no formulario de solicitude blade
HTML. O @csrf
é polo tanto unha directiva Blade
usado para xerar un token oculto validado pola aplicación.
A directiva Blade
é a sintaxe utilizada no motor de modelos Laravel chamado Lámina . Para crear un ficheiro blade
tes que darlle un nome -no noso caso forma- seguido da extensión da folla. Isto significa que o ficheiro terá o nome form.blade.php
.
Utilízase o ficheiro blade
para renderizar vistas para os usuarios na páxina web. Hai un par de predirectivasdefisintaxe taquigráfica nite ou blade que pode usar. Por exemplo, @if
comprobar se se cumpre unha condición, @empty
comprobar se os rexistros non están baleiros, @auth
comprobar se un usuario está autenticado, etc.
Pero volvamos á directiva @csrf
. Aquí tes como usalo:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
As versións anteriores de Laravel tiñan unha configuración diferente: ambas funcionan e fan o mesmo.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Cando falta o token CSRF na solicitude de formulario que se está enviando ou se parece non válido, Laravel lanza unha mensaxe de erro "Páxina caducada" cun código de estado 419.
O middleware VerifyCsrfToken
xestiona a verificación CSRF dentro da aplicación Laravel. O middleware
está rexistrado en Kernel.php
e está situado no directorio app/Http/Middleware
. Isto significa que o middleware
desenvólvese para solicitudes dentro da web, non relacionadas coas API.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
O middleware VerifyCsrfToken estende a clase Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, é dicir, a verificación CSRF é definoite dentro da clase.
Profundicemos para descubrir como Laravel xestiona a verificación CSRF.
Dentro da clase, temos a función tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
no código determina se a sesión e os tokens CSRF de entrada coinciden.
A función fai dúas cousas:
$this->getTokenFromRequest
o token da solicitude entrante adxunto a través dun campo oculto ou a cabeceira da solicitude. O token decífrase e despois devólvese á variable do token.protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
try {
$token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
} catch (DecryptException $e) {
$token = '';
}
}
return $token;
}
No código recibe un token da cabeceira
2. Envía o token de solicitude e a sesión a unha cadea e úsao hash_equals
construído en PHP para comparar se ambas cadeas son iguais. O resultado desta operación é sempre bool (verdadeiro) ou (falso) .
Ercole Palmeri
O pasado luns, o Financial Times anunciou un acordo con OpenAI. FT licencia o seu xornalismo de clase mundial...
Millóns de persoas pagan por servizos de streaming, pagando taxas de subscrición mensuais. É unha opinión común que vostede...
Coveware by Veeam continuará ofrecendo servizos de resposta a incidentes de extorsión cibernética. Coveware ofrecerá capacidades forenses e de remediación...
O mantemento preditivo está a revolucionar o sector do petróleo e do gas, cun enfoque innovador e proactivo para a xestión das plantas...