Existe-t-il des risques de sécurité ou de performances particuliers dans l'utilisation du CLR dans SQL Server?
11
Existe-t-il des risques de sécurité ou de performances particuliers dans l'utilisation du CLR dans SQL Server?
Réponses:
La question, comme l'a souligné Remus, est trop générique pour obtenir une réponse car la réponse dépend du contexte de la fonctionnalité à utiliser et de la façon dont elle sera utilisée.
Concernant la "Sécurité":
Si vous posez des questions sur tout ce qui peut être fait dans un assemblage marqué
PERMISSION_SET = SAFE
, il n'y a aucun problème que j'ai jamais pu trouver. Et SQLCLR est "plus sûr" que d'utiliserxp_cmdshell
ou les merveilleuxsp_OA*
procs ( c'était du sarcasme) (ou même des procédures stockées étendues, mais j'espère que personne n'en crée plus).Si vous souhaitez une explication de ce que signifie «SAFE» en termes pratiques, veuillez consulter cet article: Escalier vers SQLCLR Niveau 3: Sécurité (assemblées générales et SAFE) (inscription gratuite requise).
Si vous posez des questions sur tout ce qui peut être fait dans un assemblage marqué par
PERMISSION_SET = EXTERNAL_ACCESS
, alors il y a certainement des risques, encore une fois, selon la fonctionnalité utilisée. Si vous écrivez une routine pour lire les répertoires et les noms de fichiers (c'est-à-dire en lecture seule), il s'agit simplement de ce qui doit être vu et non vu. Si vous écrivez du code qui permet de supprimer un fichier, le risque augmente. Mais ce qui peut être fait avec ces ressources externes est contrôlé par:Si vous posez des questions sur tout ce qui peut être fait dans un assemblage marqué d'un
PERMISSION_SET = UNSAFE
, c'est assez ouvert. De nombreuses fonctionnalités sont jugées utilisables uniquement dans les assemblages NON SÉCURITAIRES, car ce sont des problèmes de stabilité et / ou de comportement cohérent plus que de sécurité ou de performances. Par exemple, dans un assemblage UNSAFE, il est possible d'avoir une variable statique inscriptible. Ce n'est généralement pas une bonne chose à faire car les classes SQLCLR sont partagées entre toutes les sessions. Si votre intention est de partager des données en mémoire sur toutes les sessions et que vous avez planifié les conditions de course (et fait de nombreux tests), alors tout devrait bien se passer, car vous vous attendez à ce comportement. Mais si vous vouliez simplement qu'une variable statique inscriptible pour mettre en cache une valeur pour une session particulière n'ait pas à la rechercher à nouveau ou à la calculer à nouveau, et que vous ne saviez pas que d'autres sessions lisent cette valeur et éventuellement la remplacent, eh bien, ce serait un problème.Mais si vous craignez que quelqu'un écrive dans le Registre, mais que vous n'ayez pas de code qui écrit réellement dans le Registre, vous n'avez probablement pas à vous en préoccuper ;-).
Si vous souhaitez découvrir comment EXTERNAL_ACCESS et UNSAFE fonctionnent en termes pratiques, et la différence entre la configuration
TRUSTWORTHY ON
(non préférée) et l'utilisation d'une connexion basée sur une clé ou un certificat asymétrique, veuillez consulter cet article: Escalier vers SQLCLR niveau 4: Sécurité (assemblages EXTERNES et NON SÉCURITAIRES) (inscription gratuite requise).Concernant la "Performance":
Tout dépend de ce que vous essayez de faire et de la façon dont vous vous y prenez. Il y a certaines choses qui sont beaucoup plus rapides dans SQLCLR, et certaines choses qui sont plus lentes. Mais tout comme avec T-SQL, il est possible de prendre une tâche quelque peu simple et / ou efficace et de la rendre compliquée et / ou inefficace en faisant les choses de manière incorrecte. Mais l'utilisation de SQL CLR n'est pas intrinsèquement, par nature, plus lente.
la source
Ensembles SQLCLR peuvent être installés avec trois niveaux d'accès de sécurité:
SAFE | EXTERNAL_ACCESS | UNSAFE
. Ceci est amplement documenté, consultezCREATE ASSEMBLY
et assemblées Conception :Il existe d'autres restrictions sur les attributs CLR autorisés et seul un sous-ensemble des assemblys .Net Framework est pris en charge. Encore une fois, reportez-vous à la documentation liée.
En ce qui concerne les performances, le plus important est de se rappeler que SQL Server est un environnement multitâche coopératif, contrairement à CLR. Le code SQLCLR doit appeler
Thread.BeginThreadAffinity()
chaque fois qu'il monopolise le processeur pour n'importe quelle durée (y compris le blocage). Adam Machanic a une excellente présentation sur le sujet, regardez Data, Faster: Microsoft SQL Server Performance Techniques with SQLCLR .Le sujet est vaste et la question vague. SQLCLR peut effectuer certaines tâches uniques qu'aucune autre fonctionnalité ne peut égaler. Et SQLCLR n'est qu'une autre arme dans l'arsenal de SQL Server avec laquelle vous pouvez vous tirer une balle dans le pied, la performance ou la sécurité. Lisez la documentation.
la source