2009-05-11 10 views
1

Ich möchte in der Lage sein, ein neues SQL-LOGIN hinzuzufügen und es nach einer Person E-Mail-Adresse nennen. Zum Beispiel "[email protected]". Wenn ich dies an die folgende gespeicherte Prozedur übergebe, erhalte ich einen Fehler (Fehler folgt Prozedur).SQL Encode String-Parameter so Sonderzeichen arbeiten

Die gespeicherte Prozedur:

CREATE PROCEDURE [Forms].[AddLogin] 
    @Email nvarchar(2048), 
    @TenantPassword nvarchar(2048) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    EXEC('CREATE LOGIN ' + @Email + ' WITH PASSWORD = ''' + @TenantPassword + ''', DEFAULT_DATABASE = DunderMifflin') 
END 

Der Fehler:

Msg 102, Level 15, State 1, Line 1 
Incorrect syntax near '.'. 

Ich bin sicher, dass alles, was ich tun müssen, um irgendwie die Parameter codieren. Irgendeine Hilfe? Wenn ich einen Benutzer über den SQL-Manager-Assistenten hinzufüge, kann ich E-Mail-Adressen angeben, sodass ich weiß, dass es sich um einen gültigen Anmeldenamen handelt.

+0

Obligatorische Injektionswarnung: Bitte geben Sie das Passwort des Benutzers nicht direkt in diese Routine ein !! Der Benutzer könnte ein Passwort von geben '); DROP DATABASE DunderMifflin; - – BradC

Antwort

2

Sie sollten sie in der Lage sein, zu umgeben, mit eckigen Klammern, as detailed here:

EXEC('CREATE LOGIN [' + @Email + '] WITH PASSWORD = ''' + @TenantPassword + ''', DEFAULT_DATABASE = DunderMifflin') 
+0

+1 Netter Fang. Dies kann immer noch fehlschlagen, wenn Ihr Kennwort nicht komplex genug ist, sodass Sie möglicherweise einen Rückgabewert angeben möchten! – Andomar

+0

Beachten Sie, dass dies fehlschlägt, wenn ein Apostroph im Passwort vorhanden ist! – BradC

+0

Angenommen, er wäre ihm nicht schon entkommen, ja. Das ist außerhalb des Rahmens seiner Frage, aber der Link in meiner Antwort geht über einige Techniken, um diese Möglichkeit zu vermeiden. –

0

Obligatorische Injektion Warnung: Was immer Sie tun, bitte das Kennwort des Benutzers direkt in diese Routine nicht passieren !! Was passiert, wenn der Benutzer eingegeben ein Passwort

bill');DROP DATABASE DunderMifflin;-- 

und dann ausgeführt werden Sie im Grunde die Aussage:

CREATE LOGIN [email protected] WITH PASSWORD = 'bill'); 
DROP DATABASE DunderMifflin; 
-- ''', DEFAULT_DATABASE = DunderMifflin') 

und das ist nicht gut.

+0

Stimme völlig zu und bin mir dieses Problems bewusst. Also, was schlägst du vor, um es zu sichern? – Justin

+0

Eigentlich sieht es so aus, als ob es viele Vorschläge in dem obigen Link von Tschad gibt. – Justin

+0

ja, Chads Link enthält einige gute Vorschläge. Ich wollte diese Schwachstelle nur dann in den Vordergrund rücken, wenn Sie sich des Risikos bereits bewusst sind. – BradC