Pengantar
Cross-Site Request Forgery (CSRF) adalah salah satu jenis serangan keamanan yang sering terjadi pada aplikasi web. Serangan ini memanfaatkan kepercayaan yang diberikan oleh browser pengguna terhadap suatu situs web untuk melakukan tindakan yang tidak diinginkan tanpa sepengetahuan pengguna. Artikel ini akan membahas secara lengkap tentang CSRF, contoh serangan, metode penangkalannya, serta contoh implementasi token CSRF beserta kode programnya.
Apa Itu Serangan CSRF?
CSRF adalah serangan yang memaksa pengguna yang telah terautentikasi untuk mengirim permintaan (request) yang tidak diinginkan ke sebuah aplikasi web. Serangan ini terjadi ketika penyerang berhasil memanipulasi pengguna untuk melakukan tindakan tertentu di situs web yang mereka percayai, seperti mengubah kata sandi, melakukan transfer uang, atau mengirim pesan.
Bagaimana CSRF Bekerja?
- Pengguna Login: Pengguna login ke sebuah situs web (misalnya, situs perbankan) dan mendapatkan sesi yang valid.
- Pengguna Mengunjungi Situs Berbahaya: Pengguna kemudian mengunjungi situs web lain yang berbahaya tanpa logout dari situs perbankan.
- Permintaan Palsu: Situs berbahaya tersebut mengirimkan permintaan palsu ke situs perbankan menggunakan sesi yang masih aktif.
- Tindakan Tidak Diinginkan: Permintaan palsu tersebut dapat melakukan tindakan yang tidak diinginkan, seperti transfer uang, tanpa sepengetahuan pengguna.
Contoh Serangan CSRF
Misalkan ada sebuah situs perbankan yang memiliki fitur transfer uang. Form transfer uang tersebut menggunakan metode POST dengan parameter seperti berikut:
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="toAccount" value="attackerAccount">
<input type="submit" value="Transfer">
</form>
Penyerang dapat membuat sebuah situs web yang berisi form serupa dan memanipulasi pengguna untuk mengklik tombol “Transfer”. Jika pengguna sudah login ke situs perbankan, permintaan transfer akan dikirim tanpa sepengetahuan pengguna.
Metode Penangkal Serangan CSRF
Ada beberapa metode yang dapat digunakan untuk mencegah serangan CSRF:
- CSRF Token: Menggunakan token unik yang disematkan dalam setiap form atau permintaan. Token ini akan divalidasi oleh server sebelum memproses permintaan.
- SameSite Cookies: Menggunakan atribut
SameSitepada cookie untuk mencegah pengiriman cookie dalam konteks lintas situs. - Validasi Referer Header: Memeriksa header
Refereruntuk memastikan bahwa permintaan berasal dari situs yang sah. - Double Submit Cookie: Mengirimkan token CSRF dalam cookie dan form, lalu membandingkan keduanya di server.
Contoh Implementasi Token CSRF
Berikut adalah contoh implementasi token CSRF menggunakan PHP dan HTML.
1. Membuat Token CSRF
<?php
session_start();
function generateCsrfToken() {
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
?>
2. Menyematkan Token CSRF dalam Form
<form action="process.php" method="POST">
<input type="hidden" name="csrf_token" value="<?php echo generateCsrfToken(); ?>">
<input type="text" name="amount" placeholder="Amount">
<input type="text" name="toAccount" placeholder="To Account">
<input type="submit" value="Transfer">
</form>
3. Validasi Token CSRF di Server
<?php
session_start();
function validateCsrfToken($token) {
return isset($_SESSION['csrf_token']) && $_SESSION['csrf_token'] === $token;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$csrfToken = $_POST['csrf_token'] ?? '';
if (!validateCsrfToken($csrfToken)) {
die('CSRF token validation failed.');
}
// Proses transfer uang
$amount = $_POST['amount'];
$toAccount = $_POST['toAccount'];
echo "Transfer of $amount to $toAccount has been processed.";
}
?>
4. Menghapus Token CSRF setelah Digunakan
<?php
session_start();
function generateCsrfToken() {
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
function clearCsrfToken() {
unset($_SESSION['csrf_token']);
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$csrfToken = $_POST['csrf_token'] ?? '';
if (!validateCsrfToken($csrfToken)) {
die('CSRF token validation failed.');
}
// Proses transfer uang
$amount = $_POST['amount'];
$toAccount = $_POST['toAccount'];
echo "Transfer of $amount to $toAccount has been processed.";
// Hapus token setelah digunakan
clearCsrfToken();
}
?>
Kesimpulan
Serangan CSRF adalah ancaman serius yang dapat mengakibatkan kerugian besar bagi pengguna dan organisasi. Dengan memahami cara kerja serangan ini dan menerapkan metode penangkal yang tepat, seperti penggunaan token CSRF, kita dapat melindungi aplikasi web dari serangan CSRF. Implementasi token CSRF yang baik dan konsisten akan membantu memastikan bahwa setiap permintaan yang diterima oleh server adalah permintaan yang sah dan disengaja oleh pengguna.
Dengan contoh kode program yang telah disediakan, Anda dapat mulai mengimplementasikan proteksi CSRF pada aplikasi web Anda. Selalu ingat untuk menjaga keamanan aplikasi web Anda dengan memperbarui praktik keamanan secara berkala dan mengikuti perkembangan terbaru dalam dunia keamanan siber.