Sebagai jawaban atas pertanyaan langsung Anda:Apakah kode ini mencegah injeksi SQL:Tidak
Inilah buktinya - dorong string ini melalui metode PrepareString:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Saya memodifikasi metode GetRecord yang Anda posting untuk mengembalikan string SQL yang telah disiapkan sepenuhnya daripada mendapatkan catatan dari database:
Console.WriteLine(GetRecord(output))
Dan ini adalah outputnya
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Tambahkan 1 baris kode tambahan:
My.Computer.Clipboard.SetText(input)
Dan Anda memiliki string yang perlu disalin langsung ke clipboard Anda untuk ditempelkan ke bidang input Anda di situs web untuk menyelesaikan injeksi SQL Anda:
'; Drop Table TableName; - -
[Memperhatikan bahwa karakter kontrol telah dihilangkan dari keluaran kiriman oleh StackOverflow, jadi Anda harus mengikuti contoh kode untuk membuat keluaran Anda]
Setelah metode PrepareString dijalankan, ia akan memiliki output yang sama persis - kode ASCII Chr(8) adalah spasi mundur yang akan menghapus "'" ekstra yang Anda tambahkan ke tambang yang akan menutup string Anda dan kemudian saya bebas untuk menambahkan apa pun yang saya inginkan di akhir. SiapkanString Anda tidak melihat -- karena saya sebenarnya menggunakan - - dengan karakter spasi mundur untuk menghilangkan spasi.
Hasil kode SQL yang Anda buat kemudian akan mengeksekusi pernyataan Drop Table saya tanpa hambatan dan segera mengabaikan sisa kueri Anda.
Hal yang menyenangkan tentang ini adalah Anda dapat menggunakan karakter yang tidak dapat dicetak untuk mengabaikan pemeriksaan karakter apa pun yang dapat Anda ciptakan. Jadi, paling aman menggunakan kueri berparameter (bukan itu yang Anda minta, tetapi merupakan jalur terbaik untuk menghindarinya).