Cara Mencegah Serangan XSS dan CSRF di PHP

Selain SQL injection, dua serangan web yang sangat umum adalah XSS dan CSRF. Keduanya berbahaya tetapi mudah dicegah bila Anda tahu caranya. Artikel ini membahas cara mencegah XSS dan CSRF di PHP.

1. XSS (Cross-Site Scripting)

XSS terjadi ketika penyerang menyisipkan kode JavaScript berbahaya lewat input, yang kemudian dijalankan di browser pengunjung lain. Contoh: seseorang menulis komentar berisi <script>curiCookie()</script>.

Solusi: Escaping Output dengan htmlspecialchars()

Selalu ubah karakter HTML menjadi entитas saat menampilkan data dari pengguna:

<?php
// BERBAHAYA
echo $_POST["komentar"];

// AMAN
echo htmlspecialchars($_POST["komentar"], ENT_QUOTES, "UTF-8");
?>

Dengan htmlspecialchars(), tag <script> ditampilkan sebagai teks biasa, bukan dijalankan. Inti aturannya: escape SAAT output, bukan saat menyimpan.

Perlindungan Tambahan

  • Set header Content-Security-Policy untuk membatasi sumber skrip.
  • Tandai cookie dengan HttpOnly agar tak bisa dibaca JavaScript.

2. CSRF (Cross-Site Request Forgery)

CSRF menipu pengguna yang sedang login agar tanpa sadar mengirim request berbahaya (misalnya menghapus data) lewat situs jahat. Karena browser otomatis mengirim cookie login, server mengira request itu sah.

Solusi: Token CSRF

Sisipkan token acak unik di setiap form, lalu verifikasi saat form dikirim. Token dibuat saat menampilkan form:

<?php
session_start();
if (empty($_SESSION["csrf_token"])) {
    $_SESSION["csrf_token"] = bin2hex(random_bytes(32));
}
?>
<form method="post">
    <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
    <input type="text" name="data">
    <button type="submit">Kirim</button>
</form>

Saat form diproses, cocokkan token:

<?php
session_start();
if (!hash_equals($_SESSION["csrf_token"], $_POST["csrf_token"] ?? "")) {
    die("Permintaan tidak valid (kemungkinan CSRF).");
}
// token valid, lanjut proses
?>

Penyerang tidak mengetahui token ini, sehingga request palsunya ditolak. Gunakan hash_equals() untuk membandingkan agar aman dari timing attack.

Kesimpulan

Untuk mencegah XSS, selalu bungkus output data pengguna dengan htmlspecialchars(). Untuk mencegah CSRF, sisipkan token unik di setiap form dan verifikasi saat diproses. Bersama prepared statement (anti-SQL injection), tiga teknik ini adalah fondasi keamanan aplikasi web PHP.

Referensi: untuk pendalaman, kunjungi panduan keamanan resmi PHP.

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *