Berhenti!
Anda membuat kesalahan di sini. Oh, tidak, Anda sudah memilih fungsi PHP yang tepat untuk membuat data Anda sedikit lebih aman. Tidak apa-apa. Kesalahan Anda adalah dalam urutan operasi , dan bagaimana dan di mana menggunakan fungsi-fungsi ini.
Penting untuk memahami perbedaan antara membersihkan dan memvalidasi data pengguna, melarikan diri data untuk penyimpanan, dan melarikan diri data untuk presentasi.
Sanitasi dan Validasi Data Pengguna
Saat pengguna mengirimkan data, Anda perlu memastikan bahwa mereka telah memberikan sesuatu yang Anda harapkan.
Sanitasi dan Penyaringan
Misalnya, jika Anda mengharapkan nomor, pastikan data yang dikirimkan adalah angka . Anda juga bisa memasukkan data pengguna ke tipe lain. Segala sesuatu yang dikirimkan pada awalnya diperlakukan seperti string, sehingga memaksa data numerik yang dikenal menjadi bilangan bulat atau float membuat sanitasi menjadi cepat dan tidak menyakitkan.
Bagaimana dengan bidang teks bentuk bebas dan bidang teks? Anda perlu memastikan bahwa tidak ada yang tak terduga di bidang itu. Terutama, Anda perlu memastikan bahwa bidang yang seharusnya tidak memiliki konten HTML sebenarnya tidak mengandung HTML. Ada dua cara untuk mengatasi masalah ini.
Pertama, Anda dapat mencoba melarikan diri dengan masukan HTML htmlspecialchars
. Anda sebaiknya tidak menggunakan htmlentities
untuk menetralkan HTML, karena itu juga akan melakukan pengkodean aksen dan karakter lain yang menurutnya juga perlu dikodekan.
Kedua, Anda dapat mencoba menghapus HTML apa pun yang mungkin. strip_tags
cepat dan mudah, tetapi juga ceroboh. HTML Purifier melakukan pekerjaan yang jauh lebih menyeluruh baik dari menghapus semua HTML dan juga memungkinkan daftar putih dari tag dan atribut.
Versi PHP modern dikirimkan dengan ekstensi filter , yang menyediakan cara komprehensif untuk membersihkan input pengguna.
Validasi
Memastikan bahwa data yang dikirimkan bebas dari konten yang tidak terduga hanya setengah dari pekerjaan. Anda juga perlu mencoba dan memastikan bahwa data yang dikirim mengandung nilai yang benar-benar dapat Anda gunakan.
Jika Anda mengharapkan angka antara 1 dan 10, Anda perlu memeriksa nilai itu. Jika Anda menggunakan salah satu input angka era HTML5 mewah baru dengan pemintal dan langkah-langkah, pastikan bahwa data yang dikirimkan sesuai dengan langkah tersebut.
Jika data itu berasal dari apa yang seharusnya menjadi menu tarik-turun, pastikan bahwa nilai yang dikirimkan adalah yang muncul di menu.
Bagaimana dengan input teks yang memenuhi kebutuhan lain? Misalnya, input tanggal harus divalidasi melalui strtotime
atau kelas DateTime . Tanggal yang diberikan harus antara rentang yang Anda harapkan. Bagaimana dengan alamat email? Ekstensi filter yang disebutkan sebelumnya dapat memeriksa apakah suatu alamat terbentuk dengan baik, meskipun saya penggemar perpustakaan is_email .
Hal yang sama berlaku untuk semua kontrol bentuk lainnya. Punya tombol radio? Validasikan terhadap daftar. Punya kotak centang? Validasikan terhadap daftar. Punya file unggah? Pastikan file tersebut dari tipe yang diharapkan, dan perlakukan nama file seperti data pengguna tanpa filter.
Setiap peramban modern hadir dengan seperangkat alat pengembang lengkap yang terpasang di dalamnya, yang membuatnya sepele bagi siapa saja untuk memanipulasi formulir Anda. Kode Anda harus mengasumsikan bahwa pengguna telah sepenuhnya menghapus semua batasan sisi klien pada konten formulir !
Melarikan Data untuk Penyimpanan
Sekarang setelah Anda memastikan bahwa data Anda dalam format yang diharapkan dan hanya berisi nilai-nilai yang diharapkan, Anda perlu khawatir tentang mempertahankan data tersebut untuk disimpan.
Setiap mekanisme penyimpanan data tunggal memiliki cara khusus untuk memastikan data lolos dengan benar dan disandikan. Jika Anda sedang membangun SQL, maka cara yang diterima untuk meneruskan data dalam kueri adalah melalui pernyataan yang disiapkan dengan placeholder .
Salah satu cara yang lebih baik untuk bekerja dengan sebagian besar database SQL di PHP adalah ekstensi PDO . Ini mengikuti pola umum menyiapkan pernyataan , mengikat variabel ke pernyataan , kemudian mengirim pernyataan dan variabel ke server . Jika Anda belum pernah bekerja dengan PDO sebelumnya, inilah tutorial berorientasi MySQL yang cukup bagus .
Beberapa database SQL memiliki ekstensi khusus mereka sendiri di PHP, termasuk SQL Server , PostgreSQL dan SQLite 3 . Masing-masing ekstensi tersebut telah menyiapkan dukungan pernyataan yang beroperasi dengan cara persiapan-bind-eksekusi yang sama dengan PDO. Terkadang Anda mungkin perlu menggunakan ekstensi ini alih-alih PDO untuk mendukung fitur atau perilaku non-standar.
MySQL juga memiliki ekstensi PHP sendiri. Dua dari mereka, sebenarnya. Anda hanya ingin menggunakan yang disebut mysqli . Ekstensi "mysql" lama telah usang dan tidak aman atau waras untuk digunakan di era modern.
Saya pribadi bukan penggemar mysqli. Cara itu melakukan pengikatan variabel pada pernyataan yang disiapkan tidak fleksibel dan bisa menjadi sulit untuk digunakan. Jika ragu, gunakan PDO sebagai gantinya.
Jika Anda tidak menggunakan basis data SQL untuk menyimpan data Anda, periksa dokumentasi untuk antarmuka basis data yang Anda gunakan untuk menentukan cara melewati data dengan aman.
Jika memungkinkan, pastikan bahwa database Anda menyimpan data Anda dalam format yang sesuai. Simpan angka dalam bidang angka. Simpan tanggal di bidang tanggal. Menyimpan uang dalam bidang desimal, bukan bidang floating point. Tinjau dokumentasi yang disediakan oleh database Anda tentang cara menyimpan berbagai tipe data dengan benar.
Melarikan Data untuk Presentasi
Setiap kali Anda menampilkan data kepada pengguna, Anda harus memastikan bahwa data tersebut lolos dengan aman, kecuali jika Anda tahu bahwa data itu tidak boleh melarikan diri.
Saat memancarkan HTML, Anda harus selalu melewati data apa pun yang semula dipasok oleh pengguna htmlspecialchars
. Bahkan, satu-satunya waktu Anda tidak boleh melakukan ini adalah ketika Anda tahu bahwa pengguna menyediakan HTML, dan Anda tahu bahwa itu sudah dibersihkan dengan menggunakan daftar putih.
Terkadang Anda perlu membuat beberapa Javascript menggunakan PHP. Javascript tidak memiliki aturan pelolosan yang sama dengan HTML! Cara aman untuk memberikan nilai yang diberikan pengguna ke Javascript melalui PHP adalah melalui json_encode
.
Dan lagi
Ada banyak lagi nuansa ke validasi data.
Sebagai contoh, pengkodean karakter dapat menjadi perangkap besar . Aplikasi Anda harus mengikuti praktik yang dijabarkan dalam " UTF-8 all through through ". Ada serangan hipotetis yang dapat terjadi ketika Anda memperlakukan data string sebagai rangkaian karakter yang salah.
Sebelumnya saya menyebutkan alat debug browser. Alat-alat ini juga dapat digunakan untuk memanipulasi data cookie. Cookie harus diperlakukan sebagai input pengguna yang tidak dipercaya .
Validasi dan pelolosan data hanya satu aspek dari keamanan aplikasi web. Anda harus membuat diri Anda sadar akan metodologi serangan aplikasi web sehingga Anda dapat membangun pertahanan terhadap mereka.