Keamanan dasar di PHP bukan cuma soal menutup celah besar. Di project kecil, masalah paling sering justru muncul dari asumsi yang terlalu percaya pada input user, query database yang disusun manual, dan output yang langsung dilempar ke HTML tanpa encoding yang benar.
Topik ini membahas enam area yang hampir selalu muncul di aplikasi web PHP:
input validation: memastikan data yang masuk sesuai aturan
sanitization: membersihkan atau menetralkan data supaya aman diproses di konteks tertentu
password hashing: menyimpan password dengan format yang tidak bisa dibalik
CSRF: mencegah request palsu yang dikirim atas nama user yang sedang login
XSS: mencegah script berbahaya masuk ke halaman dan jalan di browser user
SQL injection: mencegah input user mengubah struktur query SQL
Kalau disederhanakan, alurnya begini: data masuk harus diperiksa, disimpan dengan cara yang benar, lalu ditampilkan kembali dengan encoding yang sesuai konteks.
Gambaran alur ancaman → mitigasi → respons
Loading diagram...
Diagram ini sengaja memisahkan ancaman, mitigasi, dan respons. Banyak project kecil gagal karena semua masalah dianggap “cukup di-clean dulu”. Padahal tiap risiko punya konteks sendiri.
Input validation
Input validation adalah proses memastikan data yang diterima sesuai bentuk, tipe, panjang, dan aturan bisnis yang diharapkan.
Contoh yang umum:
email harus format email
umur harus angka dalam rentang tertentu
status hanya boleh salah satu dari nilai yang diizinkan
ID harus numeric atau UUID yang valid
field wajib tidak boleh kosong
Prinsip dasar
Validasi dilakukan untuk menolak data yang salah, bukan untuk membersihkan data berbahaya.
Itu penting, karena banyak orang mencampur validasi dengan sanitization. Dua hal ini beda:
validation: apakah datanya boleh diterima?
sanitization: bagaimana data itu dibersihkan atau dinormalisasi?
Kalau database bocor, hash yang kuat jauh lebih aman daripada password mentah. Hash modern juga dirancang lambat, supaya brute force lebih mahal.
Catatan praktis
jangan bikin hash sendiri dengan md5(), sha1(), atau sha256() untuk password
gunakan PASSWORD_DEFAULT agar ikut mengikuti rekomendasi PHP terbaru
pastikan proses login selalu memakai password_verify()
kalau algoritma berubah di versi baru, rencanakan rehash saat login bila perlu
Jebakan umum
menyimpan password untuk “kemudahan reset”
membandingkan hash dengan operator string biasa tanpa fungsi verifikasi yang tepat
memakai hashing umum yang cepat, padahal password butuh algoritma khusus
CSRF
CSRF atau Cross-Site Request Forgery adalah serangan ketika browser user yang sedang login dipakai untuk mengirim request yang tidak ia maksudkan.
Masalah ini muncul karena browser otomatis menyertakan cookie sesi pada request yang cocok. Kalau aplikasi hanya mengandalkan cookie sesi tanpa validasi tambahan, request berbahaya bisa terlihat sah.
Mitigasi dasar
pakai CSRF token pada form state-changing
validasi token di server
gunakan SameSite cookie bila cocok dengan kebutuhan aplikasi
bedakan request yang mengubah state dengan request yang hanya baca data