Saya pernah mendengar bahwa "semua orang" menggunakan kueri SQL berparameter untuk melindungi dari serangan injeksi SQL tanpa harus memvalidasi setiap masukan pengguna.
Bagaimana kamu melakukan ini? Apakah Anda mendapatkan ini secara otomatis saat menggunakan prosedur tersimpan?
Jadi pemahaman saya ini adalah non-parameterized:
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)
Apakah ini akan dijadikan parameter?
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)
Atau apakah saya perlu melakukan sesuatu yang lebih ekstensif seperti ini untuk melindungi diri saya dari injeksi SQL?
With command
.Parameters.Count = 1
.Parameters.Item(0).ParameterName = "@baz"
.Parameters.Item(0).Value = fuz
End With
Apakah ada keuntungan lain menggunakan kueri berparameter selain pertimbangan keamanan?
Pembaruan: Artikel bagus ini ditautkan di salah satu referensi pertanyaan oleh Grotok. http://www.sommarskog.se/dynamic_sql.html
sql
vb.net
sql-parametrized-query
Jim Hitungan
sumber
sumber
Jawaban:
Contoh EXEC Anda TIDAK akan dijadikan parameter. Anda memerlukan kueri berparameter (pernyataan yang disiapkan di beberapa lingkaran) untuk mencegah masukan seperti ini menyebabkan kerusakan:
Coba letakkan itu di variabel fuz Anda (atau jangan, jika Anda menghargai tabel batang Anda). Kueri yang lebih halus dan merusak juga dimungkinkan.
Berikut adalah contoh bagaimana Anda melakukan parameter dengan Sql Server:
Prosedur yang disimpan terkadang dikreditkan dengan mencegah injeksi SQL. Namun, seringkali Anda masih harus memanggilnya menggunakan parameter kueri atau mereka tidak membantu. Jika Anda menggunakan prosedur tersimpan secara eksklusif , maka Anda dapat mematikan izin untuk PILIH, PERBARUI, ALTER, BUAT, HAPUS, dll (hampir semuanya kecuali JALANKAN) untuk akun pengguna aplikasi dan mendapatkan perlindungan dengan cara itu.
sumber
cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
?@Baz
tipevarchar(50)
yang diberi nilaiBaz
string.AddWithValue("@Baz", Baz)
, Anda dapat melakukannya, tetapi Anda tidak boleh melakukannya , terutama karena mengonversi nilai string yang dipetakan secara default ke tipenvarchar
aktualvarchar
adalah salah satu tempat paling umum yang dapat memicu efek yang disebutkan dalam tautan itu.Pasti yang terakhir, yaitu
Kueri yang diparameterisasi memiliki dua keunggulan utama:
sumber
Anda ingin menggunakan contoh terakhir Anda karena ini adalah satu-satunya yang benar-benar parametrized. Selain masalah keamanan (yang jauh lebih umum daripada yang mungkin Anda pikirkan), yang terbaik adalah membiarkan ADO.NET menangani parametrization karena Anda tidak dapat memastikan apakah nilai yang Anda berikan memerlukan tanda kutip tunggal di sekitarnya atau tidak tanpa memeriksa
Type
setiap parameter .[Sunting] Berikut adalah contohnya:
sumber
Kebanyakan orang akan melakukan ini melalui pustaka bahasa pemrograman sisi server, seperti PDO PHP atau Perl DBI.
Misalnya, di PDO:
Ini menangani pelolosan data Anda untuk penyisipan database.
Salah satu keuntungannya adalah Anda dapat mengulangi penyisipan berkali-kali dengan satu pernyataan yang disiapkan, mendapatkan keuntungan kecepatan.
Misalnya, dalam kueri di atas saya dapat menyiapkan pernyataan sekali, dan kemudian mengulang membuat larik data dari sekumpulan data dan ulangi -> mengeksekusi sebanyak yang diperlukan.
sumber
Teks perintah Anda harus seperti ini:
Kemudian tambahkan nilai parameter. Cara ini memastikan bahwa nilai con hanya akan digunakan sebagai nilai, sedangkan dengan metode lain jika variabel fuz disetel ke
dapatkah kamu melihat apa yang mungkin terjadi?
sumber
Berikut adalah kelas singkat untuk memulai dengan SQL dan Anda dapat membangun dari sana dan menambahkannya ke kelas.
MySQL
MS SQL / Express
sumber