Heim  >  Artikel  >  Datenbank  >  Fügen Sie das von der Anwendung verwendete Konto in SQL Server hinzu

Fügen Sie das von der Anwendung verwendete Konto in SQL Server hinzu

伊谢尔伦
伊谢尔伦Original
2016-12-03 11:10:581025Durchsuche

In früheren Kundenberatungsfällen verwendeten viele Kundenanwendungen direkt SA-Konten, um eine Verbindung zu SQL Server herzustellen. Wenn die Datenbankverwaltung etwas strenger ist, sollte der Anwendung diese Art von Berechtigung nicht erteilt werden. Normalerweise muss die Anwendung nur Hinzufügungen, Löschungen, Änderungen und Abfragen durchführen, jedoch selten DDL-Vorgänge. Daher gilt das Prinzip der „Zuweisung der geringsten Rechte“. " sollte beim Konfigurieren von Konten befolgt werden. Erteilen Sie die erforderlichen Berechtigungen.

Für Anwendungen werden in der Regel die Mindestberechtigungen Leseberechtigungen, Schreibberechtigungen und Ausführungsberechtigungen für gespeicherte Prozeduren erteilt. Um den Verlust von Datenbankinformationen durch SQL-Injection zu verhindern, müssen Sie auch darüber nachdenken, dem Konto die Berechtigung zum Anzeigen von Definitionen zu verweigern. Beachten Sie jedoch, dass das Masseneinfügen fehlschlägt, wenn die Berechtigung zum Anzeigen von Definitionen verweigert wird. Die vollständige Berechtigungsdefinition lautet wie folgt:

ALTER ROLE [db_datareader] ADD MEMBER 用户名
ALTER ROLE [db_datawriter] ADD MEMBER 用户名
grant execute to 用户名
deny view definition to 用户名

In SQL Server ist die Instanzebene der Anmeldename, während die Datenbankebene der Benutzername ist. Der Anmeldename kann nach der Erstellung einer bestimmten Bibliothek zugeordnet werden . Daher habe ich ein vollständiges Skript geschrieben, um Anmeldenamen und Benutzer zu erstellen und entsprechende Berechtigungen zu erteilen. Das Skript lautet wie folgt:

--创建用户的存储过程, 
--示例EXEC sp_CreateUser 'UserName','rw','DatabaseName' 
--EXEC sp_CreateUser 'tesefx','r','Test','0xE39CA97EBE03BB4CA5FF78E50374EEBB' 
CREATE PROC sp_CreateUser 
@loginName VARCHAR(50) , 
@IsWrite VarCHAR(3) , 
@DatabaseName VARCHAR(50), 
@Sid VARCHAR(100) ='1' 
AS 
PRINT('示例:EXEC sp_CreateUser ''UserName'',''rw'',''DatabaseName''') 
PRINT('示例:EXEC sp_CreateUser ''UserName'',''rwv'',''DatabaseName'',''0xE39CA97EBE03BB4CA5FF78E50374EEBB''') 
PRINT('r为只读权限,rw为读写权限,rwv为读写加View Definition权限') 
IF EXISTS ( SELECT name 
FROM sys.syslogins 
WHERE name = @loginName ) 
BEGIN 
PRINT N'登录名已存在,跳过创建登录名步骤' 
END 
ELSE 
BEGIN 
DECLARE @CreateLogin NVARCHAR(1000) 
DECLARE @pwd VARCHAR(50) 
PRINT @Sid 
SET @pwd=NEWID() 
IF(@sid='1') 
BEGIN 
SET @CreateLogin = 'CREATE LOGIN [' + @loginName + '] WITH PASSWORD=N''' 
+ @Pwd 
+ ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;' 
PRINT N'登录名已创建,密码为:'+@pwd 
END 
ELSE 
BEGIN 
SET @CreateLogin = 'CREATE LOGIN [' + @loginName + '] WITH PASSWORD=N''' 
+ @Pwd 
+ ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF,sid='+@Sid+';' 
PRINT N'已经使用SID创建登录名:'+@loginName 
END 
EXEC (@CreateLogin) 
--DECLARE @sidtemp NVARCHAR(50) 
--SELECT @sidtemp=sid FROM sys.server_principals WHERE name=@loginName 
--PRINT(N'登录名为:'+@loginName+N' SID为: 0x'+CONVERT(VARCHAR(50), @sidtemp, 2) ) 
END 
DECLARE @DynamicSQL NVARCHAR(1000) 
--切换数据库上下文 
SET @DynamicSQL = N'Use [' + @DatabaseName + ']; ' + 'IF EXISTS(SELECT name FROM sys.database_principals WHERE name='''+@loginName+''') Begin Print(''用户名已存在,跳过创建用户名的步骤'') end else begin CREATE USER [' 
+ @loginName + '] FOR LOGIN ' + @loginName + ' end;IF (''' 
+ @IsWrite 
+ '''=''rw'' or ''' 
+ @IsWrite 
+ '''=''rwv'') BEGIN ALTER ROLE [db_datareader] ADD MEMBER ' + @loginName 
+ ';ALTER ROLE [db_datawriter] ADD MEMBER ' + @loginName 
+ '; END ELSE BEGIN ALTER ROLE [db_datareader] ADD MEMBER ' 
+ @loginName + '; 
ALTER ROLE db_datawriter DROP MEMBER ' 
+ @loginName + ' 
;End;grant execute to ' + @loginName + '; 
if(&#39;&#39;&#39;+@IsWrite+&#39;&#39;&#39;<>&#39;&#39;rwv&#39;&#39;) begin deny view definition to &#39; + @loginName + &#39;; end else begin grant view definition to &#39; + @loginName + &#39;; end&#39; 
EXEC (@DynamicSQL)

Diese gespeicherte Prozedur wird verwendet, um den Anmeldenamen zu erstellen, der für die Verbindung der Anwendung erforderlich ist zu SQL Server. Dieser Schritt wird übersprungen, wenn der Benutzer- oder Anmeldename vorhanden ist:

EXEC sp_CreateUser &#39;UserName&#39;,&#39;rw&#39;,&#39;DatabaseNam&#39;
EXEC sp_CreateUser &#39;tesefx&#39;,&#39;r&#39;,&#39;Test&#39;,&#39;0xE39CA97EBE03BB4CA5FF78E50374EEBB&#39;

Die erste Zeile der obigen Ausführung ist Erstellen Sie ein Standardkonto. Der Kontoname UserName gewährt Lese- und Schreibberechtigungen für die DatabaseNam-Bibliothek und gibt das generierte GUID-Passwort zurück. Die zweite gespeicherte Prozedur verwendet den vierten Parameter „sid“, um einen Anmeldenamen zu erstellen. Da in AlwaysOn- oder Spiegelungsumgebungen die Anmeldenamen an beiden Enden dieselbe SID haben müssen, wird in diesem Fall eine Methode zum Erstellen eines Anmeldenamens mithilfe der SID bereitgestellt.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn