CSRF là một hoạt động độc hại được thực hiện bởi kẻ tấn công, kẻ này thực hiện các hành động thay mặt cho người dùng được xác thực, gây bất lợi cho bảo mật web. May mắn thay, Laravel cung cấp các công cụ để ngăn chặn loại lỗ hổng này.
Các cuộc tấn công CSRF chiếm quyền điều khiển phiên người dùng. Họ làm điều này bằng cách lừa người dùng gửi yêu cầu thông qua thẻ biểu mẫu ẩn hoặc URL độc hại (hình ảnh hoặc liên kết) mà người dùng không hề hay biết.
Cuộc tấn công này dẫn đến thay đổi trạng thái phiên của người dùng, rò rỉ dữ liệu và đôi khi tin tặc có thể thao túng dữ liệu của người dùng cuối trong một ứng dụng.
Hình ảnh trên minh họa một tình huống trong đó bảo mật web bị vi phạm. Nạn nhân gửi yêu cầu bằng cách nhấp vào liên kết (đã nhận), gửi yêu cầu đến máy chủ trang web sẽ tạo ra các hiệu ứng mà tin tặc mong muốn, kẻ sở hữu thông tin hữu ích để truy cập và thao túng máy chủ trang web.
Để cải thiện an ninh web của ứng dụng của bạn, trong mỗi phiên người dùng, Laravel tạo mã thông báo bảo mật mà nó sử dụng để đảm bảo rằng người dùng được xác thực là người yêu cầu ứng dụng.
Vì mã thông báo này thay đổi mỗi khi phiên người dùng được tạo lại, nên kẻ tấn công không thể truy cập mã thông báo này.
Bất cứ khi nào có yêu cầu thay đổi thông tin người dùng phía máy chủ (phụ trợ) như POST
, PUT
, PATCH
e DELETE
, bạn phải bao gồm chỉ thị @csrf
trong mẫu yêu cầu blade
HTML. Các @csrf
do đó nó là một chỉ thị Blade
được sử dụng để tạo mã thông báo ẩn được ứng dụng xác thực.
chỉ thị Blade
là cú pháp được sử dụng trong công cụ mẫu Laravel được gọi là Lưỡi . Để tạo một tập tin blade
bạn phải đặt tên cho nó – trong trường hợp của chúng tôi – theo sau là phần mở rộng của lưỡi kiếm. Điều này có nghĩa là tệp sẽ có tên form.blade.php
.
Các tập tin được sử dụng blade
để hiển thị chế độ xem cho người dùng trên trang web. Có một vài chỉ dẫn trướcdefibạn có thể sử dụng cú pháp tốc ký nite hoặc blade. Ví dụ, @if
kiểm tra nếu một điều kiện được thỏa mãn, @empty
kiểm tra xem các bản ghi không trống, @auth
kiểm tra xem người dùng có được xác thực hay không, v.v.
Nhưng chúng ta hãy quay trở lại chỉ thị @csrf
. Đây là cách bạn sử dụng nó:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Các phiên bản trước của Laravel có cách thiết lập khác: cả hai đều hoạt động và thực hiện cùng một công việc.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Khi mã thông báo CSRF bị thiếu trong yêu cầu biểu mẫu đang được gửi hoặc nếu nó có vẻ không hợp lệ, Laravel sẽ đưa ra thông báo lỗi “Page Expired” với mã trạng thái 419.
phần mềm trung gian VerifyCsrfToken
xử lý xác minh CSRF trong ứng dụng Laravel. Các middleware
được đăng ký trong Kernel.php
và nằm trong thư mục app/Http/Middleware
. Điều này có nghĩa là middleware
nó được kích hoạt cho các yêu cầu trong web, không liên quan đến API.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
Phần mềm trung gian VerifyCsrfToken mở rộng lớp Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, tức là xác minh CSRF là defitối trong lớp.
Hãy tìm hiểu sâu hơn để tìm hiểu cách Laravel xử lý xác minh CSRF.
Bên trong lớp, chúng ta có chức năng tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
trong mã xác định xem phiên và mã thông báo CSRF đầu vào có khớp hay không.
Hàm này thực hiện hai việc:
$this->getTokenFromRequest
mã thông báo từ yêu cầu đến được đính kèm thông qua trường ẩn hoặc tiêu đề yêu cầu. Mã thông báo được giải mã và sau đó được trả về biến mã thông báo.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;
}
Trong mã, nó nhận được mã thông báo từ tiêu đề
2. Truyền cả mã thông báo yêu cầu và phiên thành một chuỗi rồi sử dụng hash_equals
được xây dựng trong PHP để so sánh nếu cả hai chuỗi bằng nhau. Kết quả của hoạt động này luôn luôn bool (đúng) hoặc (sai) .
Ercole Palmeri
Một ca phẫu thuật tạo hình mắt bằng cách sử dụng trình xem thương mại Apple Vision Pro đã được thực hiện tại Phòng khám đa khoa Catania…
Phát triển kỹ năng vận động tinh thông qua tô màu giúp trẻ chuẩn bị cho những kỹ năng phức tạp hơn như viết. Để tô màu…
Ngành hải quân là một cường quốc kinh tế toàn cầu thực sự, đang hướng tới thị trường 150 tỷ...
Thứ Hai tuần trước, Financial Times đã công bố một thỏa thuận với OpenAI. FT cấp phép cho hoạt động báo chí đẳng cấp thế giới…