Bagikan melalui


Menulis SQL dinamis yang aman di SQL Server

Mengunduh ADO.NET

Injeksi SQL adalah proses di mana pengguna berbahaya memasukkan pernyataan Transact-SQL alih-alih input yang valid. Jika input diteruskan langsung ke server tanpa divalidasi dan jika aplikasi secara tidak sengaja menjalankan kode yang disuntikkan, serangan berpotensi merusak atau menghancurkan data.

Prosedur apa pun yang membangun pernyataan SQL harus ditinjau untuk kerentanan injeksi karena SQL Server akan menjalankan semua kueri yang valid secara sintetis yang diterimanya. Bahkan data berparameter dapat dimanipulasi oleh penyerang yang terampil dan ditentukan. Jika Anda menggunakan SQL dinamis, pastikan untuk membuat parameter perintah Anda, dan jangan pernah menyertakan nilai parameter langsung ke dalam string kueri.

Anatomi serangan injeksi SQL

Proses injeksi bekerja dengan menghentikan string teks secara prematur dan menambahkan perintah baru. Karena perintah yang disisipkan mungkin memiliki string tambahan yang ditambahkan sebelum dijalankan, malefaktor mengakhiri string yang disuntikkan dengan tanda komentar "--". Teks berikutnya diabaikan pada waktu eksekusi. Beberapa perintah dapat disisipkan menggunakan titik koma (pemisah ;).

Selama kode SQL yang disuntikkan benar secara sintetis, perubahan tidak dapat dideteksi secara terprogram. Oleh karena itu, Anda harus memvalidasi semua input pengguna dan dengan cermat meninjau kode yang menjalankan perintah SQL yang dibangun di server yang Anda gunakan. Jangan pernah menggabungkan input pengguna yang tidak divalidasi. Perangkaian string adalah titik entri utama untuk injeksi skrip.

Berikut adalah beberapa panduan bermanfaat:

  • Jangan pernah membangun pernyataan Transact-SQL langsung dari input pengguna; gunakan prosedur tersimpan untuk memvalidasi input pengguna.

  • Validasi input pengguna dengan menguji jenis, panjang, format, dan rentang. Gunakan fungsi TRANSACT-SQL QUOTENAME() untuk menghindari nama sistem atau fungsi REPLACE() untuk menghindari karakter apa pun dalam string.

  • Terapkan beberapa lapisan validasi di setiap tingkat aplikasi Anda.

  • Uji ukuran dan jenis data input dan tertibkan batas yang sesuai. Ini dapat membantu mencegah overrun buffer yang disengaja.

  • Uji konten variabel string dan terima hanya nilai yang diharapkan. Tolak entri yang berisi data biner, urutan escape, dan karakter komentar.

  • Saat Anda bekerja dengan dokumen XML, validasi semua data terhadap skemanya saat dimasukkan.

  • Di lingkungan multi-tingkat, semua data harus divalidasi sebelum masuk ke zona tepercaya.

  • Jangan terima string berikut dalam bidang tempat nama file dapat dibangun: AUX, CLOCK$, COM1 hingga COM8, CON, CONFIG$, LPT1 hingga LPT8, NUL, dan PRN.

  • Gunakan SqlParameter objek dengan prosedur dan perintah tersimpan untuk memberikan pemeriksaan jenis dan validasi panjang.

  • Gunakan Regex ekspresi dalam kode klien untuk memfilter karakter yang tidak valid.

Strategi SQL dinamis

Menjalankan pernyataan SQL yang dibuat secara dinamis dalam kode prosedural Anda memutus rantai kepemilikan, menyebabkan SQL Server memeriksa izin pemanggil terhadap objek yang diakses oleh SQL dinamis.

SQL Server memiliki metode untuk memberi pengguna akses ke data menggunakan prosedur tersimpan dan fungsi yang ditentukan pengguna yang menjalankan SQL dinamis.

  • Menggunakan peniruan dengan klausa Transact-SQL EXECUTE AS.

  • Menandatangani prosedur tersimpan dengan sertifikat.

JALANKAN SEBAGAI

Klausa EXECUTE AS menggantikan izin pemanggil dengan yang ditentukan pengguna dalam klausul EXECUTE AS. Prosedur atau pemicu tersimpan berlapis dijalankan di bawah konteks keamanan pengguna proksi. Ini dapat memutus aplikasi yang mengandalkan keamanan tingkat baris atau memerlukan audit. Beberapa fungsi yang mengembalikan identitas pengguna mengembalikan pengguna yang ditentukan dalam klausa EXECUTE AS, bukan pemanggil asli. Konteks eksekusi dikembalikan ke pemanggil asli hanya setelah eksekusi prosedur atau ketika pernyataan REVERT dikeluarkan.

Penandatanganan sertifikat

Ketika prosedur tersimpan yang telah ditandatangani dengan sertifikat dijalankan, izin yang diberikan kepada pengguna sertifikat digabungkan dengan pemanggil. Konteks eksekusi tetap sama; pengguna sertifikat tidak meniru pemanggil. Penandatanganan prosedur tersimpan memerlukan beberapa langkah untuk diterapkan. Setiap kali prosedur dimodifikasi, prosedur harus ditandatangani ulang.

Akses lintas database

Rantai kepemilikan lintas database tidak berfungsi jika pernyataan SQL yang dibuat secara dinamis dijalankan. Anda dapat mengatasinya di SQL Server dengan membuat prosedur tersimpan yang mengakses data di database lain dan menandatangani prosedur dengan sertifikat yang ada di kedua database. Ini memberi pengguna akses ke sumber daya database yang digunakan oleh prosedur tanpa memberi mereka akses atau izin database.

Sumber daya eksternal

Untuk informasi selengkapnya, lihat sumber berikut ini:

Sumber daya Deskripsi
Prosedur Tersimpan dan Injeksi SQL di Buku SQL Server Online Topik menjelaskan cara membuat prosedur tersimpan dan cara kerja Injeksi SQL.

Langkah berikutnya