Search

Cross-Site Scripting (XSS) adalah salah satu kerentanan keamanan paling umum di aplikasi web. Serangan XSS memungkinkan penyerang menyuntikkan skrip berbahaya ke halaman web yang dilihat oleh pengguna lain, yang dapat mengakibatkan pencurian data, defacement, atau serangan lain.

Dalam lingkungan produksi, proteksi XSS harus menjadi prioritas. Berikut adalah praktik terbaik untuk mencegah XSS di aplikasi Anda.

1. Validasi dan Sanitasi Input

Setiap input dari pengguna harus divalidasi dan disanitasi sebelum diproses.

✅ Gunakan library sanitasi yang terpercaya:

  • Untuk JavaScript: DOMPurifysanitize-html

  • Untuk PHP: htmlspecialchars()strip_tags()

  • Untuk Python (Django/Flask): django.utils.html.escapebleach

Contoh di JavaScript (Node.js):

const DOMPurify = require('dompurify');
const dirtyInput = '<script>alert("XSS")</script>';
const cleanInput = DOMPurify.sanitize(dirtyInput);
console.log(cleanInput); // Output: (script tag dihapus)

2. Gunakan Content Security Policy (CSP)

CSP adalah lapisan keamanan tambahan yang membatasi sumber skrip yang boleh dijalankan di browser.

✅ Contoh CSP Header:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src *;
  • default-src 'self' hanya memperbolehkan resource dari domain sendiri.

  • script-src membatasi sumber JavaScript.

  • 'unsafe-inline' sebaiknya dihindari jika memungkinkan.


3. Escape Output Sebelum Render

Selalu escape data sebelum menampilkannya di HTML, JavaScript, atau atribut.

✅ Contoh di PHP:

<?php
$userInput = "<script>alert('XSS')</script>";
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// Output: &lt;script&gt;alert('XSS')&lt;/script&gt;
?>

✅ Contoh di Django (Python):

from django.utils.html import escape

user_input = "<script>alert('XSS')</script>"
safe_output = escape(user_input)  # Auto-escaped di template Django

4. Hindari innerHTML dan Gunakan textContent

Penggunaan innerHTML di JavaScript bisa memicu XSS. Sebaiknya gunakan textContent.

❌ Berbahaya:

document.getElementById('output').innerHTML = userInput; // Risiko XSS!

✅ Aman:

document.getElementById('output').textContent = userInput; // Aman dari XSS

5. Set Cookie dengan Flag HttpOnly dan Secure

Cookie sebaiknya tidak bisa diakses via JavaScript untuk mencegah pencurian session.

✅ Contoh di Express.js:

res.cookie('sessionID', '12345', {
  httpOnly: true,  // Tidak bisa diakses via document.cookie
  secure: true,    // Hanya dikirim via HTTPS
  sameSite: 'Strict' // Mencegah CSRF
});

6. Gunakan Framework Modern dengan Proteksi Bawaan

Framework seperti React, Angular, dan Vue.js memiliki mekanisme auto-escaping:

  • React: Melakukan escape otomatis di JSX ({userInput} aman).

  • Angular: Menggunakan binding ({{userInput}}) yang sudah di-sanitize.

  • Vue.js: v-text lebih aman daripada v-html.


7. Lakukan Scanning & Testing Rutin

  • Static Application Security Testing (SAST): Gunakan tools seperti SonarQube, Snyk.

  • Dynamic Application Security Testing (DAST): OWASP ZAP, Burp Suite.

  • Automated Penetration Testing: Cek kerentanan XSS secara berkala.


Kesimpulan

Proteksi XSS di lingkungan produksi membutuhkan pendekatan multi-lapisan:

  1. ✅ Sanitasi input & escape output

  2. ✅ Gunakan CSP

  3. ✅ Hindari innerHTML

  4. ✅ HttpOnly & Secure Cookie

  5. ✅ Manfaatkan framework modern

  6. ✅ Lakukan pengujian keamanan rutin

Dengan menerapkan langkah-langkah ini, risiko serangan XSS dapat diminimalkan secara signifikan.

🚀 Stay Secure, Happy Coding!