Apa itu CSRF?
CSRF (Cross-Site Request Forgery) adalah serangan yang memaksa browser pengguna yang sudah login mengirimkan request ke website target tanpa sepengetahuan pengguna. Browser secara otomatis menyertakan cookie (termasuk session cookie) di setiap request.
Bagaimana CSRF Bekerja
// 1. User login ke bank.com dan mendapat session cookie
// 2. User mengunjungi evil.com (tab baru, link di email, dll.)
// 3. evil.com memiliki form tersembunyi:
<form action="https://bank.com/transfer" method="POST" id="attack">
<input type="hidden" name="to" value="hacker-account" />
<input type="hidden" name="amount" value="10000000" />
</form>
<script>document.getElementById("attack").submit();</script>
// Browser mengirim POST ke bank.com dengan cookie session user!
// Bank.com mengira request ini dari user yang sah
Syarat CSRF Berhasil
- User sudah login ke website target (punya session aktif)
- Website target tidak memiliki proteksi CSRF
- Aksi bisa dilakukan dengan satu request (form submission, img src, dll.)
Cara Mencegah CSRF
1. CSRF Token
// Server generate token unik per session/form
<form action="/transfer" method="POST">
<input type="hidden" name="_token" value="random-csrf-token-abc123" />
<!-- ... field lain -->
</form>
// Server memvalidasi token di setiap POST request
// Laravel otomatis melakukan ini dengan @csrf directive
<form method="POST" action="/transfer">
@csrf
<!-- ... -->
</form>
2. SameSite Cookie
// SameSite=Strict: cookie tidak dikirim di cross-site request
Set-Cookie: session=abc; SameSite=Strict; Secure; HttpOnly
// SameSite=Lax: cookie dikirim hanya untuk top-level navigation GET
Set-Cookie: session=abc; SameSite=Lax; Secure; HttpOnly
3. Verifikasi Origin dan Referer Header
// Cek header Origin atau Referer
function csrfCheck(req, res, next) {
const origin = req.headers.origin || req.headers.referer;
if (!origin || !origin.startsWith("https://myapp.com")) {
return res.status(403).json({ error: "CSRF detected" });
}
next();
}
CSRF dan API
- API yang menggunakan token di header (Bearer token) secara alami terlindungi dari CSRF, karena penyerang tidak bisa membuat browser menyertakan custom header
- API yang menggunakan cookie-based auth harus menerapkan proteksi CSRF