Czy są jakieś szczególne zagrożenia bezpieczeństwa lub wydajności podczas korzystania z CLR w SQL Server?
sql-server
performance
security
sql-clr
SQLBen
źródło
źródło
Odpowiedzi:
Pytanie, jak zauważył Remus, jest zbyt ogólne, aby uzyskać odpowiedź, ponieważ odpowiedź zależy od kontekstu, jaka funkcjonalność ma zostać użyta i jak zostanie wykorzystana.
W odniesieniu do „bezpieczeństwa”:
Jeśli pytasz o cokolwiek, co można zrobić w zestawie oznaczonym
PERMISSION_SET = SAFE
, oznacza to, że nie ma żadnych problemów, które kiedykolwiek mogłem znaleźć. A SQLCLR jest „bezpieczniejszy” niż używaniexp_cmdshell
lub wspaniałe (to był sarkazm)sp_OA*
procy (lub nawet Rozszerzone Procedury Przechowywane, ale mam nadzieję, że nikt już ich nie tworzy).Jeśli chcesz dowiedzieć się, co oznacza „SAFE” w praktyce, zapoznaj się z tym artykułem: Schody do SQLCLR Poziom 3: Bezpieczeństwo (zespoły ogólne i SAFE) (wymagana bezpłatna rejestracja).
Jeśli pytasz o cokolwiek, co można zrobić w zestawie oznaczonym
PERMISSION_SET = EXTERNAL_ACCESS
, to z pewnością istnieje ryzyko, ponownie, w zależności od używanej funkcjonalności. Jeśli piszesz procedurę czytania katalogów i nazw plików (tj. Tylko do odczytu), to tylko kwestia tego, co powinno być widoczne, a czego nie. Jeśli piszesz kod, który pozwala na usunięcie pliku, ryzyko wzrasta. Ale to, co można zrobić z tymi zasobami zewnętrznymi, jest kontrolowane przez:Jeśli pytasz o cokolwiek, co można zrobić w zestawie oznaczonym
PERMISSION_SET = UNSAFE
, to jest dość otwarte. Wiele funkcji uważa się za użyteczne tylko w zespołach UNSAFE, ponieważ są to kwestie stabilności i / lub spójnego zachowania bardziej niż bezpieczeństwo lub wydajność. Na przykład w zespole UNSAFE można mieć zapisywalną zmienną statyczną. Zazwyczaj nie jest to dobre, ponieważ klasy SQLCLR są wspólne dla wszystkich sesji. Jeśli masz zamiar udostępniać dane w pamięci we wszystkich sesjach i zaplanowałeś warunki wyścigu (i wykonałeś wiele testów), powinieneś być w porządku, ponieważ spodziewasz się takiego zachowania. Ale jeśli po prostu chciałeś, aby zapisywalna zmienna statyczna buforowała wartość dla konkretnej sesji, aby nie musieć jej ponownie sprawdzać ani obliczać, i nie byłaś świadoma tego, że inne sesje odczytują tę wartość i prawdopodobnie ją nadpisują, cóż, to byłby problem.Ale jeśli martwisz się o kogoś, kto pisze do Rejestru, ale nie masz żadnego kodu, który faktycznie zapisuje w Rejestrze, prawdopodobnie nie musisz się tym martwić ;-).
Jeśli chcesz zapoznać się z praktycznym działaniem EXTERNAL_ACCESS i UNSAFE oraz różnicą między ustawieniem
TRUSTWORTHY ON
(nie preferowanym) a użyciem Asymetrycznego logowania opartego na kluczu lub certyfikacie, zapoznaj się z tym artykułem: Schody do SQLCLR poziom 4: Bezpieczeństwo (zespoły ZEWNĘTRZNE i NIEBEZPIECZNE) (wymagana bezpłatna rejestracja).W odniesieniu do „wydajności”:
To wszystko zależy od tego, co próbujesz zrobić i jak to zrobić. Istnieją pewne rzeczy, które są znacznie szybsze w SQLCLR, a niektóre rzeczy, które są wolniejsze. Ale podobnie jak w przypadku T-SQL, możliwe jest podjęcie nieco prostego i / lub wydajnego zadania oraz uczynienie go skomplikowanym i / lub nieefektywnym poprzez nieprawidłowe działanie. Ale korzystanie z SQL CLR nie jest z natury z natury wolniejsze.
źródło
Zespoły SQLCLR mogą być instalowane z trzema poziomami dostępu Bezpieczeństwo:
SAFE | EXTERNAL_ACCESS | UNSAFE
. Jest to obszernie udokumentowane, patrzCREATE ASSEMBLY
i Projektowanie zespołów :Istnieją dalsze ograniczenia dotyczące dozwolonych atrybutów CLR i obsługiwany jest tylko podzbiór .NET Framework Asemblies. Ponownie zapoznaj się z dołączoną dokumentacją.
Jeśli chodzi o wydajność, najważniejsze jest, aby pamiętać, że SQL Server to współpracujące środowisko wielozadaniowe, podczas gdy CLR nie. Kod SQLCLR musi wywoływać za
Thread.BeginThreadAffinity()
każdym razem, gdy zajmie CPU na dowolny czas (w tym blokowanie). Adam Machanic ma doskonałą prezentację na ten temat, obejrzyj dane, szybciej: Microsoft SQL Server Performance Techniques with SQLCLR .Temat jest obszerny, a pytanie niejasne. SQLCLR może wykonywać niektóre unikalne zadania, których żadna inna funkcja nie może dopasować. A SQLCLR to kolejna broń w arsenale SQL Server, z którą możesz strzelać sobie w stopę, osiągami lub bezpieczeństwem. Przeczytaj dokumentację.
źródło