Chống CSRF, XSS và SQL Injection
Bảo mật là một phần không thể thiếu trong mọi ứng dụng web. Laravel cung cấp nhiều cơ chế tích hợp sẵn để bảo vệ hệ thống khỏi các lỗ hổng thường gặp như CSRF, XSS, và SQL Injection. Bài học này giúp bạn nhận diện và phòng tránh các rủi ro trên một cách đúng đắn trong Laravel.

1 CSRF (Cross-Site Request Forgery)
Khái niệm: Tấn công CSRF lợi dụng trình duyệt người dùng đang đăng nhập để gửi các yêu cầu giả mạo.
Cách Laravel xử lý:
- Laravel tự động chèn token xác thực CSRF vào mỗi form thông qua
@csrf
. - Token này được xác thực bởi middleware
VerifyCsrfToken
.
Ví dụ:
<form method="POST" action="/profile/update">
@csrf
<input type="text" name="name">
<button type="submit">Cập nhật</button>
</form>
2 XSS (Cross Site Scripting)
Khái niệm: Kẻ tấn công chèn mã JavaScript vào nội dung trang để đánh cắp thông tin người dùng.
Cách phòng chống trong Laravel:
- Dữ liệu output mặc định sẽ được escape khi sử dụng cú pháp
{{ $data }}
. - Tuyệt đối tránh dùng
{!! $data !!}
với dữ liệu chưa được lọc.
Ví dụ không an toàn:
{!! $comment->content !!}
Cách làm an toàn:
{{ $comment->content }}
3 SQL Injection
Khái niệm: Kẻ tấn công chèn mã SQL vào input để thao túng cơ sở dữ liệu.
Cách phòng chống trong Laravel:
- Không bao giờ nối chuỗi SQL thủ công từ input người dùng.
- Luôn dùng query builder hoặc Eloquent ORM.
Ví dụ nguy hiểm:
$email = $_GET['email'];
$user = DB::select("SELECT * FROM users WHERE email = '$email'");
Cách làm an toàn:
$user = DB::table('users')->where('email', $email)->first();
// hoặc
$user = User::where('email', $email)->first();
Bài tập thực hành
CSRF:
- Tạo một form với
@csrf
, submit thử để thấy hoạt động bình thường. - Sau đó, xóa
@csrf
và submit lại để kiểm chứng lỗi 419 (token mismatch).
XSS:
- Tạo input cho phép nhập nội dung bình luận, ví dụ:
<script>alert("xss")</script>
. - Hiển thị lại bình luận bằng
{{ $comment }}
để xác minh rằng script không chạy.
SQL Injection:
- Thử viết một truy vấn bằng Eloquent để lấy người dùng theo email:
User::where('email', request('email'))->first();
- So sánh với cách truy vấn nối chuỗi và nêu lý do tại sao không nên dùng cách đó.
Kết luận
Laravel hỗ trợ nhiều công cụ mạnh mẽ giúp bạn bảo vệ ứng dụng khỏi các tấn công phổ biến như CSRF, XSS và SQL Injection. Tuy nhiên, ý thức lập trình an toàn vẫn là yếu tố then chốt. Việc hiểu rõ bản chất từng loại tấn công sẽ giúp bạn phát hiện và phòng tránh lỗ hổng hiệu quả hơn.

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.
Xem thêm

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.
Liên hệ công việc qua email dưới đây.
lhvuctu@gmail.com