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:
DOMPurify
,sanitize-html
-
Untuk PHP:
htmlspecialchars()
,strip_tags()
-
Untuk Python (Django/Flask):
django.utils.html.escape
,bleach
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: <script>alert('XSS')</script>
?>
✅ 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 daripadav-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:
-
✅ Sanitasi input & escape output
-
✅ Gunakan CSP
-
✅ Hindari
innerHTML
-
✅ HttpOnly & Secure Cookie
-
✅ Manfaatkan framework modern
-
✅ Lakukan pengujian keamanan rutin
Dengan menerapkan langkah-langkah ini, risiko serangan XSS dapat diminimalkan secara signifikan.
🚀 Stay Secure, Happy Coding!