2010-02-01 8 views
1

Le code SQL suivant est-il sensible à l'injection SQL via le paramètre @SearchWord?Paramètres de la fonction FormsOf et injection SQL

Je veux utiliser des paramètres avec la fonction FORMSOF, mais le seul guide pour le faire, je l'ai trouvé est dans ce Stack Overflow question: How to pass parameter to FormsOf function in sql server

Cependant, la solution semble être d'utiliser un peu de SQL dynamique , et je me demandais si cela serait susceptible d'injection SQL. Que se passerait-il dans l'exemple suivant si @searchWord contenait une chaîne de type injection SQL? N'est-ce pas un problème car il est toujours dans un paramètre, passé en argument à FREETEXTTABLE?

La solution donnée est:

DECLARE @SearchWord nvarchar(max) 
SET @SearchWord = 'tax' 

DECLARE @SearchString nvarchar(max) 
SET @SearchString = 'FormsOf(INFLECTIONAL, "' + @SearchWord + '")' 

SELECT listing_id, RANK, name, address, city, zip, heading, phone 
FROM listings a, 
FREETEXTTABLE(listings, *, @SearchString) 
WHERE [KEY] = a.listing_id 
ORDER BY RANK DESC, name 

Répondre

2

Non, ce n'est pas sensible. Il n'y a pas de SQL dynamique ici (qui nécessiterait soit l'utilisation de EXEC ou sp_executesql), donc il n'y a pas de vecteur pour l'injection SQL.

Pour qu'une vulnérabilité d'injection SQL existe, la chaîne fournie par l'utilisateur (dans ce cas, @SearchWord) doit être insérée directement dans le texte de l'instruction SQL. Ici, il est seulement utilisé pour construire une autre variable chaîne, qui est ensuite utilisée comme paramètre pour une autre instruction SQL.

Cette déclaration peut, cependant, ne pas si l'utilisateur entre un mot de recherche « invalide », à savoir un contenant des guillemets simples, vous devriez donc échapper sans doute encore quelle que soit la valeur est passée à @SearchWord. Mais il ne peut pas être utilisé pour exécuter un SQL arbitraire.

1

Je n'ai pas testé, mais je ne pense pas que l'interprète est coller simplement la valeur de @SearchString dans la déclaration. Il devrait analyser @SearchString en utilisant les règles attendues par FREETEXTTABLE - c'est ainsi que fonctionnent les autres paramètres.