Query string pada URL rentan terhadap manipulasi pengguna, kebocoran data sensitif melalui riwayat browser (browser history), dan serangan injeksi jika tidak divalidasi serta dienkripsi dengan benar. Praktik terbaik keamanan query string mengharuskan pengembang untuk tidak pernah mempercayai data dari URL, menghindari penyimpanan kredensial atau informasi identitas pribadi (PII) di parameter GET, serta menerapkan sanitasi dan pengkodean keluaran (output encoding) yang ketat.
Risiko Utama Keamanan pada Query String
Sebelum menerapkan sistem pertahanan, penting untuk memahami vektor serangan yang mengeksploitasi parameter URL:
- Cross-Site Scripting (XSS): Terjadi ketika nilai query string dirender langsung ke dalam DOM tanpa sanitasi, memungkinkan eksekusi skrip berbahaya di sisi klien.
- SQL Injection: Muncul jika nilai parameter URL langsung digabungkan (concatenation) ke dalam query database tanpa parameterized statements.
- Insecure Direct Object References (IDOR) melalui manipulasi parameter ID atau referensi objek di URL.
- Kebocoran token autentikasi atau kunci API melalui log server atau HTTP referrer header saat pengguna bernavigasi ke situs eksternal.
| Ancaman Keamanan | Dampak Potensial | Solusi Mitigasi Utama |
|---|---|---|
| Sensitif Data Leakage | Pencurian password/token di log server & history | Gunakan method POST untuk data sensitif; enskripsi token. |
| SQL / NoSQL Injection | Kebocoran atau manipulasi database | Gunakan Prepared Statements / ORM yang aman. |
| Reflected XSS | Pencurian sesi pengguna (session hijacking) | Terapkan Context-aware Output Encoding. |
| Parameter Tampering | Modifikasi harga atau hak akses ilegal | Validasi server-side dan gunakan digital signature (HMAC). |
Implementasi Teknis & Contoh Kode
Berikut adalah contoh implementasi validasi dan sanitasi parameter query string menggunakan Node.js dan Express, serta teknik pencegahan injeksi:
const express = require('express');
const { query, validationResult } = require('express-validator');
const app = express();
// Contoh validasi ketat query string
app.search('/api/items', [
query('id').isInt().withMessage('ID harus berupa angka integer'),
query('search').trim().escape().optional()
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const itemId = req.query.id;
const searchTerm = req.query.search;
// Lanjutkan logika bisnis dengan parameter yang sudah aman
res.status(200).json({ status: 'success', id: itemId, query: searchTerm });
});
app.listen(3000);
Langkah-Langkah Mitigasi Lapangan
- Hindari Data Sensitif di URL: Jangan pernah meletakkan password, nomor kartu kredit, nomor induk kependudukan (NIK), atau token JWT mentah di dalam query string. Gunakan body request dengan metode POST, PUT, atau PATCH di balik protokol HTTPS.
- Gunakan Parameterized Queries: Pastikan setiap parameter yang diambil dari URL dan diteruskan ke database diolah menggunakan prepared statements untuk menutup celah injeksi SQL.
- Terapkan HMAC untuk Mencegah Tampering: Jika parameter URL memuat data krusial seperti harga diskon atau status akses yang tidak boleh diubah pengguna, bubuhkan tanda tangan kriptografi (HMAC) di dalam query string untuk memverifikasi integritasnya.
- Batasi Panjang Karakter (Length Restriction): Validasi panjang maksimum dan tipe data setiap parameter untuk mencegah serangan Buffer Overflow atau DoS berbasis query kompleks.
Troubleshooting & Validasi Keamanan
Jika aplikasi Anda masih mendeteksi kerentanan dari hasil pemindaian keamanan (DAST/SAST):
- Periksa apakah header
Referrer-Policydiatur kestrict-origin-when-cross-originuntuk mencegah kebocoran query string ke domain pihak ketiga. - Pastikan CSP (Content Security Policy) diaktifkan guna mengurangi dampak eksekusi skrip jika terjadi celah XSS yang lolos dari sanitasi query string.