Kami sedang berdiskusi lagi di sini tentang penggunaan kueri sql parametrized dalam kode kami. Kami memiliki dua sisi dalam diskusi: Saya dan beberapa orang lain yang mengatakan bahwa kami harus selalu menggunakan parameter untuk melindungi dari suntikan sql dan orang lain yang merasa tidak perlu. Sebaliknya mereka ingin mengganti satu apostrof dengan dua apostrof di semua string untuk menghindari injeksi sql. Semua database kami menjalankan Sql Server 2005 atau 2008 dan basis kode kami berjalan di .NET framework 2.0.
Izinkan saya memberi Anda contoh sederhana di C #:
Saya ingin kami menggunakan ini:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
Sementara yang lain ingin melakukan ini:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
Di mana fungsi SafeDBString didefinisikan sebagai berikut:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Sekarang, selama kami menggunakan SafeDBString pada semua nilai string dalam kueri kami, kami akan aman. Baik?
Ada dua alasan untuk menggunakan fungsi SafeDBString. Pertama, ini adalah cara yang telah dilakukan sejak zaman batu, dan kedua, lebih mudah untuk men-debug pernyataan sql karena Anda melihat kueri excact yang dijalankan pada database.
Sehingga kemudian. Pertanyaan saya adalah apakah benar-benar cukup menggunakan fungsi SafeDBString untuk menghindari serangan injeksi sql. Saya telah mencoba menemukan contoh kode yang melanggar ukuran keamanan ini, tetapi saya tidak dapat menemukan contoh apa pun.
Apakah ada orang di luar sana yang bisa memecahkan ini? Bagaimana Anda melakukannya?
EDIT: Untuk meringkas balasan sejauh ini:
- Belum ada yang menemukan cara untuk menyiasati SafeDBString di Sql Server 2005 atau 2008. Itu bagus, menurut saya?
- Beberapa balasan menunjukkan bahwa Anda mendapatkan peningkatan kinerja saat menggunakan kueri parametrized. Alasannya adalah bahwa rencana kueri dapat digunakan kembali.
- Kami juga setuju bahwa menggunakan kueri parametrized memberikan kode yang lebih mudah dibaca dan lebih mudah dikelola
- Lebih jauh, lebih mudah untuk selalu menggunakan parameter daripada menggunakan berbagai versi SafeDBString, konversi string ke angka, dan konversi string ke tanggal.
- Menggunakan parameter Anda mendapatkan konversi jenis otomatis, sesuatu yang sangat berguna ketika kita bekerja dengan tanggal atau angka desimal.
- Dan terakhir: Jangan mencoba melakukan keamanan sendiri seperti yang ditulis JulianR. Vendor database menghabiskan banyak waktu dan uang untuk keamanan. Tidak ada cara kami dapat melakukan lebih baik dan tidak ada alasan kami harus mencoba melakukan pekerjaan mereka.
Jadi, sementara tidak ada yang bisa merusak keamanan sederhana dari fungsi SafeDBString, saya mendapat banyak argumen bagus lainnya. Terima kasih!