Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 12749|Jawab: 0

[Sumber] mybatis mencegah injeksi SQL

[Salin tautan]
Diposting pada 16/08/2018 10.57.34 | | |
Injeksi SQL adalah vektor serangan sederhana yang masih sangat umum hingga saat ini. Alasannya tidak lain adalah tidak ada tambalan untuk bodoh. Mengapa Anda mengatakan ini, mari kita ambil JAVA sebagai contoh untuk mengilustrasikan:

Misalkan tabel seperti ini ada di database:


Kemudian gunakan tabel tindakan JDBC:


Kode di atas sering digunakan oleh beberapa pengembang. Bayangkan situasi di mana parameter userId yang masuk adalah "3; pengguna meja jatuh; Pernyataan SQL yang dijalankan adalah sebagai berikut:


Setelah database dikompilasi dan dieksekusi, tabel pengguna dihapus. Voila, serangan injeksi SQL sederhana berlaku! Hal ini dikarenakan kode di atas tidak sesuai dengan spesifikasi pemrograman.

Ketika kita memprogram sesuai dengan spesifikasi, injeksi SQL tidak ada. Ini juga terjadiCara pertama untuk menghindari injeksi SQL: pernyataan yang telah dikompilasi sebelumnya, kodenya adalah sebagai berikut:


Mengapa injeksi SQL tidak ada dalam kode di atas? Karena pernyataan yang telah dikompilasi sebelumnya digunakan, pernyataan yang telah dikompilasi sebelumnya akan mengatur "pilih nama dari pengguna di mana id= ?" Pernyataan tersebut disusun terlebih dahulu sehingga hanya perlu diganti dengan parameter yang masuk saat dieksekusi? Placeholder baik-baik saja. Untuk kasus pertama yang tidak sesuai, program akan menulis pernyataan SQL dan kemudian mengkompilasinya dengan konten yang diteruskan oleh pengguna, yang justru menjadi masalahnya.

Selain menggunakan pernyataan yang telah dikompilasi sebelumnya, ada opsi keduaCara menghindari serangan injeksi SQL: Prosedur tersimpan。 Prosedur tersimpan adalah sekumpulan pernyataan SQL yang melakukan fungsi tertentu, dikompilasi dan disimpan dalam database, dan pengguna dapat menjalankannya dengan memanggil prosedur tersimpan dan memberikan parameter (jika prosedur tersimpan memiliki parameter), yang juga dapat menghindari serangan injeksi SQL

Prosedur tersimpan yang sesuai dalam kode di atas adalah sebagai berikut:

Tentu saja, pengguna juga dapat melakukan pengecekan karakter di frontend, yang juga merupakan cara untuk menghindari injeksi SQL: misalnya, untuk parameter userId di atas, pengguna akan memeriksa titik koma dan kesalahan akan ditampilkan.
Namun, alasan paling mendasar adalah bahwa serangan injeksi SQL ada karena aplikasi tidak menggunakan hak istimewa paling sedikit saat mengakses database. Tampaknya semua orang telah menggunakan akun root untuk mengakses database.

Jadi bagaimana MyBatis menghindari serangan injeksi SQL? Atau ambil tabel pengguna di atas sebagai contoh:
Katakanlah file mapper adalah:


File java yang sesuai adalah:


Anda dapat melihat bahwa parameter input adalah userId dari jenis String, ketika kita meneruskan userId="34; pengguna meja jatuh; Setelah itu, pernyataan tercetak berbunyi:


Terlepas dari userID yang dimasukkan, pernyataan sql-nya seperti ini. Hal ini disebabkan oleh fakta bahwa mybatis menggunakan pernyataan yang telah dikompilasi sebelumnya dalam implementasi yang mendasarinya. Ketika database mengeksekusi pernyataan tersebut, database secara langsung menggunakan pernyataan yang telah dikompilasi sebelumnya dan kemudian mengganti placeholder dengan userId yang dilewatkan? Lari saja. Mengganti placeholder terlebih dahulu? Proses kompilasi dilakukan, sehingga tidak ada ruang bagi injeksi SQL untuk bertahan.

Jadi bagaimana MyBatis melakukan prakompilasi SQL? Faktanya, kelas PreparedStatement digunakan di bagian bawah kerangka kerja. Kelas PreparedStaement tidak hanya menghindari injeksi SQL, tetapi juga menghemat waktu kompilasi (N-1) ketika pernyataan SQL yang sama dijalankan N kali, sehingga meningkatkan efisiensi.

Jika Anda mengubah pernyataan di atas menjadi:

Saat kita memasukkan userId="34; pengguna meja jatuh; Setelah itu, pernyataan tercetak berbunyi:

Saat ini, mybatis tidak menggunakan pernyataan yang telah dikompilasi sebelumnya, ia akan menjahit string terlebih dahulu dan kemudian melakukan kompilasi, yang persis seperti bagaimana injeksi SQL berlaku.
Oleh karena itu, saat menulis pernyataan pemetaan mybatis, cobalah untuk menggunakan format "#{xxx}". Jika Anda harus menggunakan parameter seperti "${xxx}", Anda perlu memfilternya secara manual untuk mencegah serangan injeksi SQL.





Mantan:Tanda tanya C#? operator
Depan:Pintasan komentar dan batalkan komentar multi-baris di IDEA
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com