Apakah ada risiko keamanan atau kinerja tertentu dalam menggunakan CLR di SQL Server?
sql-server
performance
security
sql-clr
SQLBen
sumber
sumber
Jawaban:
Pertanyaannya, seperti yang ditunjukkan oleh Remus, terlalu umum untuk mendapatkan jawaban karena jawabannya tergantung pada konteks fungsionalitas apa yang akan digunakan dan bagaimana akan digunakan.
Mengenai "Keamanan":
Jika Anda bertanya tentang apa pun yang dapat dilakukan dalam sebuah majelis bertanda
PERMISSION_SET = SAFE
, maka tidak ada masalah yang pernah saya temukan. Dan SQLCLR adalah "lebih aman" daripada menggunakanxp_cmdshell
atausp_OA*
procs indah (itu sarkasme) (atau bahkan Extended Stored Procedures, tapi mudah-mudahan tidak ada yang membuat itu lagi).Jika Anda ingin mengetahui apa arti "AMAN" dalam istilah praktis, silakan lihat artikel ini: Stairway to SQLCLR Level 3: Keamanan (Umum dan Majelis AMAN) (diperlukan pendaftaran gratis).
Jika Anda bertanya tentang apa pun yang dapat dilakukan dalam suatu rakitan yang ditandai dengan
PERMISSION_SET = EXTERNAL_ACCESS
, maka tentu saja ada risiko, sekali lagi, tergantung pada fungsi apa yang digunakan. Jika Anda menulis rutin untuk membaca direktori dan nama file (yaitu read-only), maka itu hanya masalah apa yang harus dilihat dan tidak terlihat. Jika Anda menulis kode yang memungkinkan untuk menghapus file, risikonya meningkat. Tetapi apa yang dapat dilakukan dengan sumber daya eksternal tersebut dikendalikan oleh:Jika Anda bertanya tentang apa pun yang dapat dilakukan di majelis bertanda
PERMISSION_SET = UNSAFE
, itu cukup terbuka. Banyak fungsi dianggap hanya dapat digunakan dalam majelis UNSAFE karena mereka adalah masalah stabilitas dan / atau perilaku yang konsisten lebih dari keamanan atau kinerja. Misalnya, dalam majelis UNSAFE dimungkinkan untuk memiliki variabel statis yang dapat ditulis. Ini biasanya bukan hal yang baik untuk dilakukan karena kelas SQLCLR dibagikan di semua sesi. Jika niat Anda adalah untuk membagikan data dalam memori di semua sesi dan telah merencanakan kondisi balapan (dan melakukan banyak pengujian), maka Anda harus baik-baik saja karena Anda mengharapkan perilaku ini. Tetapi jika Anda hanya ingin variabel statis yang dapat ditulis untuk menyimpan nilai untuk sesi tertentu agar tidak perlu mencarinya lagi atau menghitungnya lagi, dan tidak menyadari bahwa sesi lain membaca nilai itu dan mungkin menulisnya secara berlebihan, yah, itu akan menjadi masalah.Tetapi jika Anda khawatir tentang seseorang yang menulis ke Registry, tetapi belum memiliki kode yang benar-benar menulis ke Registry, maka Anda mungkin tidak perlu khawatir tentang ini ;-).
Jika Anda ingin melihat bagaimana EXTERNAL_ACCESS dan UNSAFE bekerja secara praktis, dan perbedaan antara pengaturan
TRUSTWORTHY ON
(tidak disukai) vs menggunakan Login Asimetris atau Berbasis Sertifikat, silakan lihat artikel ini: Stairway to SQLCLR Level 4: Keamanan (Sidang EKSTERNAL dan UNSAFE) (diperlukan pendaftaran gratis).Mengenai "Kinerja":
Ini semua adalah masalah apa yang Anda coba lakukan dan bagaimana Anda melakukannya. Ada beberapa hal yang jauh lebih cepat di SQLCLR, dan beberapa hal yang lebih lambat. Tetapi seperti halnya dengan T-SQL, dimungkinkan untuk mengambil tugas yang agak sederhana dan / atau efisien dan membuatnya rumit dan / atau tidak efisien dengan melakukan hal-hal yang salah. Tetapi menggunakan SQL CLR secara inheren, pada dasarnya, lebih lambat.
sumber
Rakitan SQLCLR dapat diinstal dengan tiga tingkat keamanan akses:
SAFE | EXTERNAL_ACCESS | UNSAFE
. Ini banyak didokumentasikan, merujukCREATE ASSEMBLY
dan Merancang Majelis :Ada pembatasan lebih lanjut pada atribut CLR yang diizinkan dan hanya sebagian dari .Net Framework Assemblies yang didukung. Sekali lagi, lihat dokumentasi yang ditautkan.
Adapun kinerja, pemikiran paling penting adalah untuk mengingat bahwa SQL Server adalah lingkungan multi-tasking kooperatif, sedangkan CLR tidak. Kode SQLCLR harus memanggil
Thread.BeginThreadAffinity()
kapan saja ia memakan CPU untuk jangka waktu berapa pun (termasuk pemblokiran). Adam Machanic memiliki presentasi yang sangat baik tentang topik, lihat Data, Lebih Cepat: Teknik Kinerja Microsoft SQL Server dengan SQLCLR .Topiknya luas dan pertanyaannya tidak jelas. SQLCLR dapat melakukan beberapa tugas unik yang tidak cocok dengan fitur lain. Dan SQLCLR hanyalah senjata lain dalam gudang SQL Server yang dapat Anda tembak sendiri, kinerja atau keamanan. Baca dokumentasinya.
sumber