2009-05-11 5 views
1

Je voudrais être en mesure d'ajouter un nouveau SQL LOGIN et le nommer après une adresse e-mail d'une personne. Par exemple "[email protected]". Quand je passe ceci à la procédure stockée suivante j'obtiens une erreur (l'erreur suit la procédure).Paramètre de chaîne SQL Encode afin que les caractères spéciaux fonctionnent

Le proc stocké:

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 

L'erreur:

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

Je suis sûr que tout ce que je dois faire est encode le paramètre en quelque sorte. De l'aide? Si j'ajoute un utilisateur via l'assistant SQL Manager, je peux spécifier des adresses e-mail, donc je sais que c'est un nom de connexion valide.

+0

Avertissement d'injection obligatoire: Veuillez ne pas passer directement le mot de passe de l'utilisateur dans cette routine !! L'utilisateur peut entrer un mot de passe de '); DROP DATABASE DunderMifflin; - – BradC

Répondre

2

Vous devriez pouvoir l'entourer avec des crochets, as detailed here:

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

+1 Belle prise. Cela peut encore échouer lorsque votre mot de passe n'est pas assez complexe, alors vous pouvez vouloir fournir une valeur de retour! – Andomar

+0

Notez que cela échouera s'il y a une apostrophe dans le mot de passe! – BradC

+0

En supposant qu'il ne s'était pas déjà échappé, oui. C'est en dehors de la portée de sa question, mais le lien dans ma réponse couvre certaines techniques pour éviter cette possibilité. –

0

avertissement d'injection obligatoire: Quoi que vous fassiez, s'il vous plaît ne laissez pas le mot de passe de l'utilisateur directement dans cette routine !! Que faire si l'utilisateur a entré un mot de passe

bill');DROP DATABASE DunderMifflin;-- 

puis vous exécutez essentiellement la déclaration:

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

et ce n'est pas bon.

+0

Tout à fait d'accord et je suis conscient de ce problème. Alors, que proposez-vous pour le sécuriser? – Justin

+0

En fait, il semble y avoir beaucoup de suggestions dans le lien fourni ci-dessus par le Tchad. – Justin

+0

oui, le lien du Tchad contient quelques bonnes suggestions. Je voulais juste mettre cette vulnérabilité à l'avant-plan si vous n'étiez pas déjà au courant du risque. – BradC

Questions connexes