Sebagai pernyataan kueri database standar internasional, pernyataan SQL telah banyak digunakan di berbagai lingkungan pemrograman. Sebagai sistem yang matang dan stabil, verifikasi login dan kata sandi pengguna sangat penting. Dalam pekerjaan pemrograman harian saya, saya menemukan bahwa banyak programmer menggunakan pernyataan SQL untuk memverifikasi kata sandi pengguna melalui pernyataan seperti ini:
sql="Pilih * dari tabel pengguna di mana name='"+name+"' dan password='"+password+"'"
Nama dan kata sandi adalah nama pengguna dan kata sandi yang dimasukkan oleh pengguna, dan pernyataan di atas dijalankan untuk memverifikasi apakah pengguna dan kata sandi tersebut sah dan valid. Namun, melalui analisis, dapat ditemukan bahwa ada celah fatal dalam pernyataan di atas. Ketika kita memasukkan string berikut dalam nama pengguna: 111'atau'1=1, lalu masukkan kata sandi dengan santai, kita mengaturnya ke aaaa. Setelah variabel diganti, pernyataan SQL menjadi string berikut:
sql="Pilih * dari tabel pengguna di mana name='111'atau'1=1' dan password='aaaa'
Kita semua tahu bahwa ketika pernyataan select menilai kondisi kueri, itu akan mengabaikan operasi berikut dan (dan) saat menghadapi atau (atau) operasi, dan nilai 1=1 dalam pernyataan di atas selalu benar, yang berarti bahwa tidak peduli nilai apa yang dimasukkan dalam kata sandi, itu dapat melewati verifikasi kata sandi di atas! Solusi untuk masalah ini sangat sederhana, dan ada banyak metode, yang paling umum digunakan adalah menilai keabsahan pengguna dan kata sandi yang dimasukkan oleh pengguna sebelum melakukan verifikasi, dan karakter khusus seperti tanda kutip tunggal dan tanda sama tidak diperbolehkan.
Masalah di atas, meskipun mungkin tampak sederhana, memang ada. Misalnya, versi awal dari game online terkenal "Smiling Proud Jianghu" di Internet memiliki masalah seperti itu, dan penulis juga dengan cermat menganalisis beberapa program yang telah dia tulis sebelumnya setelah membaca laporan kerentanan tentang game ini, dan ada banyak celah seperti itu. Ini benar-benar harus menjadi perhatian kita. Hal ini juga mengungkap kurangnya pengalaman pemrograman dan kesadaran keamanan dari programmer muda, termasuk penulis. Pada saat yang sama, ini juga mengingatkan kita bahwa pemrogram harus sepenuhnya mempertimbangkan keamanan program saat merancang program, dan tidak boleh ceroboh, dan kelalaian yang tampaknya kecil dapat menyebabkan konsekuensi serius.
|