Jangan "sanitasi" masukan sebagai sarana untuk mencegah Injeksi SQL - gunakan placeholder (atau pelarian yang tepat) , selalu. Konsisten. Berhati-hatilah. Masalahnya sudah terpecahkan.
Kasus ini akan "aman" karena domain terbatas dari base64_encode fungsi. Namun..
Ini adalah praktik buruk dan menyimpan nilai yang disandikan base64 (sehingga kueri yang ditampilkan dapat berfungsi) membawa beberapa negatif implikasi karena berubah informasi yang disimpan:menghancurkan pengurutan nilai, membuat informasi tidak mudah ditelusuri , membutuhkan tambahan langkah "encode/decode", dan bahkan mengkonsumsi lebih banyak ruang - aduh!
Jadi, meskipun mungkin ada kasus khusus untuk data enkode base64, pendekatan ini tidak sangat cocok sebagai sarana untuk mengurangi Injeksi SQL .
Masalahnya adalah karena mengakses SQL melalui protokol teks di mana perintah/bentuk kueri dan nilai dicampur. Penggunaan benar teknik meloloskan diri (mis. mysql_real_escape_string ) memperbaikinya dengan memastikan bahwa informasi diloloskan sehingga teks SQL diurai sebagaimana dimaksud - namun, tidak seperti langkah encode base64, langkah ini tidak benar-benar mengubah informasi yang diberikan!
ini tepat yang disediakan placeholder ! Placeholder adalah yang pendekatan yang benar secara universal dan harus didorong. Placeholder mengizinkan kueri dan nilai dikirim ke database secara terpisah bila didukung oleh perpustakaan/database; dan ditiru dengan melarikan diri sebaliknya. Penggunaan placeholder yang benar menghilangkan SQL Injection dan kebutuhan kode pengguna untuk mencampur nilai ke dalam teks perintah SQL, yang juga dapat membuat kueri lebih mudah untuk ditulis dan dipelihara.
Untuk mencegah "pemrogram individu" menulis kueri yang buruk, solusinya adalah mencegah kueri ad-hoc agar tidak tersebar dalam kode:kumpulkan operasi akses data ke dalam Lapisan Akses Data ( DAL) (mungkin dalam hubungannya dengan ORM) dan hanya mengekspos tindakan yang relevan, memastikan penggunaan SQL yang tepat dalam DAL. Dalam proyek yang lebih sederhana, DAL juga merupakan lokasi yang cocok untuk mengelola aturan bisnis untuk sanitasi dan logika validasi lainnya secara terpusat.
Lebih tepatnya:
-
Sanitasi nilai untuk aturan bisnis; ini harus mencegah "informasi buruk", seperti nama pengguna yang terlalu pendek, berisi karakter terbatas, atau gagal memenuhi persyaratan bisnis.
-
Gunakan placeholder untuk mencegah Injeksi SQL . Ini sangat terkait dengan transfer data ke SQL dan tidak ada kaitannya dengan informasi di dalamnya.
Sementara MySQL 5.6.1 menambahkan FROM_BASE64 , sehingga pengkodean hanya dapat digunakan dalam teks perintah SQL, ini masih menambahkan langkah dekode eksplisit tambahan dan memperumit kueri saat menggunakan skema penyandian seperti itu. Pendekatan base64 ini tidak diperlukan, karena sudah ada teknik yang terbukti untuk mencegah injeksi SQL, dan tidak diusulkan pada pertanyaan awal.