Cara Mencegah Serangan CSRF pada Aplikasi Web

Cross-Site Request Forgery (CSRF) adalah salah satu jenis serangan web yang memungkinkan penyerang untuk memaksa pengguna melakukan tindakan yang tidak diinginkan pada aplikasi web di mana mereka telah diautentikasi. Artikel ini akan menjelaskan bagaimana menambahkan perlindungan terhadap serangan CSRF dengan menggunakan token CSRF pada aplikasi web. 


Sebelum Update: Script Rentan Terhadap Serangan CSRF

Berikut adalah contoh formulir transfer uang yang rentan terhadap serangan CSRF:

index.html

<!DOCTYPE html>
<html>
  <body>
    <h2>Transfer Uang</h2>
    <form action="transfer.php" method="POST">
      <label for="amount">Jumlah:</label><br />
      <input type="text" id="amount" name="amount" /><br />
      <label for="to">Kepada:</label><br />
      <input type="text" id="to" name="to" /><br /><br />
      <input
        type="hidden"
        name="csrf_token"
        value="<?php echo generateToken(); ?>"
      />
      <input type="submit" value="Transfer" />
    </form>
  </body>
</html>


transfer.php

<?php
session_start();
// Proses transfer (tanpa perlindungan CSRF)
$amount = $_POST['amount'];
$to = $_POST['to'];
echo "Transferred $amount to $to";
?>

Pada contoh di atas, tidak ada perlindungan terhadap serangan CSRF. Penyerang dapat membuat formulir yang mengirimkan permintaan POST ke `transfer.php` tanpa sepengetahuan pengguna.


Contoh Serangan CSRF

Berikut adalah contoh script yang dapat digunakan oleh penyerang untuk mengeksploitasi kelemahan CSRF pada aplikasi:

csrf_attack.html:

<!DOCTYPE html>
<html>
  <body>
    <h2>CSRF Attack</h2>
    <form action="http://localhost/csrf/transfer.php" method="POST">
      <input type="hidden" name="amount" value="1000" />
      <input type="hidden" name="to" value="attacker_account" />
      <input type="submit" value="Submit" />
    </form>
  </body>
</html>

Hasil attacker



Sesudah Update: Script Terlindungi dari Serangan CSRF

Untuk melindungi aplikasi web dari serangan CSRF, kita dapat menambahkan token CSRF pada formulir dan memverifikasinya di sisi server.


1. Mengubah `index.html` menjadi `index.php`:

   Karena `index.html` adalah file HTML statis, kita perlu mengubahnya menjadi file PHP untuk bisa menghasilkan token CSRF dinamis.

<?php
session_start();

function generateToken() {
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}
?>

<!DOCTYPE html>
<html>
<body>
  <h2>Transfer Uang</h2>
  <form action="transfer.php" method="POST">
    <label for="amount">Jumlah:</label><br />
    <input type="text" id="amount" name="amount" /><br />
    <label for="to">Kepada:</label><br />
    <input type="text" id="to" name="to" /><br /><br />
    <input type="hidden" name="csrf_token" value="<?php echo generateToken(); ?>" />
    <input type="submit" value="Transfer" />
  </form>
</body>
</html>


2. Memastikan Token CSRF Diterima dan Diverifikasi di `transfer.php`:

<?php
session_start();

function generateToken() {
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function verifyToken($token) {
    return $token === $_SESSION['csrf_token'];
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || !verifyToken($_POST['csrf_token'])) {
        die('Invalid CSRF token');
    }

    // Proses transfer
    $amount = $_POST['amount'];
    $to = $_POST['to'];
    // Lakukan logika transfer di sini
    echo "Transfer berhasil dilakukan ke $to sejumlah $amount.";
} else {
    die('Invalid request method');
}
?>

   

3. Memastikan Permintaan POST Terkirim dengan Token yang Benar:

   Pastikan bahwa Anda mengakses file `index.php` melalui server lokal Anda, misalnya `http://localhost/csrf/index.php`, bukan `index.html`.

4. Memastikan Tidak Ada Cache yang Mengganggu:

   Bersihkan cache browser atau gunakan mode incognito untuk memastikan tidak ada cache yang mengganggu proses pengiriman token CSRF.

Dengan langkah-langkah di atas, token CSRF seharusnya dihasilkan dan diverifikasi dengan benar, sehingga menghindari kesalahan "Invalid CSRF token". Pastikan juga bahwa session bekerja dengan baik dan tidak ada konflik di server lokal Anda.


Hasil attacker



Dampak dari Serangan CSRF

Serangan CSRF memungkinkan penyerang untuk membuat pengguna yang sah melakukan tindakan yang tidak diinginkan tanpa sepengetahuan mereka. Dampak dari serangan ini dapat sangat merugikan, termasuk:

  1. Transaksi Finansial Tidak Sah:

    • Penyerang dapat memaksa pengguna untuk melakukan transfer uang atau pembelian online tanpa sepengetahuan pengguna.
  2. Pengubahan Informasi Akun:

    • Informasi pribadi pengguna, seperti alamat email, kata sandi, atau preferensi akun, dapat diubah oleh penyerang.
  3. Penyalahgunaan Hak Istimewa:

    • Pengguna dengan hak administratif dapat dipaksa untuk membuat perubahan kritis pada sistem atau menambahkan pengguna dengan hak istimewa tinggi.
  4. Pencurian Identitas:

    • Informasi pribadi dan kredensial pengguna dapat disalahgunakan untuk berbagai bentuk penipuan dan pencurian identitas.
  5. Kerugian Reputasi:

    • Serangan CSRF pada aplikasi web yang dikelola dapat merusak reputasi bisnis dan mengurangi kepercayaan pengguna.

Kesimpulan

Menambahkan perlindungan CSRF pada aplikasi web sangat penting untuk menghindari tindakan tidak sah yang dapat membahayakan pengguna dan integritas aplikasi. Dengan menggunakan token CSRF, kita dapat memastikan bahwa setiap permintaan POST yang diterima oleh server adalah sah dan berasal dari sumber yang valid. 

Selalu pastikan untuk menerapkan praktik keamanan terbaik dalam pengembangan aplikasi web untuk melindungi pengguna dan data mereka.

Komentar

Postingan populer dari blog ini

Getting Started with NumPy - Jupyter Notebook

MongoDB : Basis Data Dokumen Terkemuka

MongoDB dengan Python