Membersihkan atau sanitize query string di PHP adalah langkah krusial untuk mencegah kerentanan keamanan seperti Cross-Site Scripting (XSS) dan SQL Injection. Cara paling aman dan direkomendasikan secara resmi oleh PHP adalah memanfaatkan fungsi bawaan seperti filter_input() atau filter_var() alih-alih mengandalkan pembersihan manual dengan regular expression yang sering kali rentan celah.
Query string yang diambil dari URL melalui global array $_GET tidak pernah boleh dipercaya mentah-mentah. Penyerang dapat menyuntikkan skrip berbahaya atau parameter tak terduga yang dapat merusak logika aplikasi atau membahayakan data pengguna lain.
Metode Utama Sanitasi Query String
PHP menyediakan ekstensi filter yang dirancang khusus untuk memvalidasi dan membersihkan data eksternal. Berikut adalah tabel perbandingan fungsi filter yang paling sering digunakan dalam pengembangan web modern:
| Fungsi PHP | Kegunaan Utama | Contoh Filter Konstanta |
|---|---|---|
filter_input() |
Mengambil dan memfilter data langsung dari $_GET, $_POST, dll. |
FILTER_SANITIZE_STRING (Deprecated), FILTER_VALIDATE_INT |
filter_var() |
Memfilter variabel yang sudah ada di dalam skrip. | FILTER_SANITIZE_EMAIL, FILTER_SANITIZE_URL |
htmlspecialchars() |
Mencegah XSS saat mencetak ulang nilai query ke HTML. | ENT_QUOTES | ENT_SUBSTITUTE |
Contoh Implementasi Kode PHP
Berikut adalah contoh penerapan nyata cara mengambil, memvalidasi, dan membersihkan parameter dari query string secara aman di dalam skrip PHP:
<?php
// Mengambil parameter 'id' dari URL (contoh: ?id=123)
// Memastikan bahwa nilai tersebut adalah integer yang valid
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($id === false || $id === null) {
$id = 0; // Nilai default jika parameter tidak ada atau tidak valid
}
// Mengambil parameter teks 'search' dari URL (contoh: ?search=hello)
$search = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if (!$search) {
$search = '';
}
echo "ID Bersih: " . $id;
echo "<br>";
echo "Pencarian Bersih: " . htmlspecialchars($search, ENT_QUOTES, 'UTF-8');
?>
Langkah-Langkah Teknis Pengamanan
- Identifikasi Input: Tentukan parameter apa saja yang wajib ada di dalam query string halaman Anda.
- Gunakan
filter_input: Akses variabel langsung dariINPUT_GETagar PHP memverifikasi keberadaannya secara aman. - Terapkan Validasi Tipe Data: Jika parameter berupa angka, gunakan
FILTER_VALIDATE_INTatauFILTER_VALIDATE_FLOAT. Jangan hanya dibersihkan, tetapi pastikan tipenya sesuai. - Escape Saat Output: Jika data query string akan ditampilkan kembali ke peramban (browser), selalu gunakan
htmlspecialchars()untuk menetralisir karakter HTML atau skrip JavaScript.
Troubleshooting Lapangan
Catatan penting untuk versi PHP terbaru (PHP 8.1 ke atas): konstanta FILTER_SANITIZE_STRING telah dinyatakan usang (deprecated). Sebagai pengganti untuk membersihkan string umum, gunakan FILTER_SANITIZE_FULL_SPECIAL_CHARS atau lakukan validasi berbasis pola (regex) dengan preg_match() jika parameter memiliki format yang sangat spesifik seperti kode SKU atau slug artikel.