2017-06-23 1 views
1

J'ai un SQL construit dynamiquement comme ci-dessous. Ma question est, est-ce vulnérable à l'injection de SQL? Si oui, comment dois-je le réparer?SQL Server SQL dynamique avec la clause LIKE et l'injection SQL

--search title only  
if @SearchType =2  
BEGIN  
    SET @strSQL = @strSQL + 'AND (IDownload.FileTitle LIKE ''%'[email protected]+'%'' ) '  
END  
+3

Oui, et il est réparable en utilisant un paramétrage approprié pour votre SQL dynamique (par exemple en utilisant sp_executesql avec @search en tant que paramètre). – ZLK

+0

@ZLK que se passe-t-il si mon code côté serveur (C#) utilise déjà un paramétrage correct et une instruction préparée, mon code SQL Server est-il toujours vulnérable? –

+0

Oui, c'est toujours vulnérable, à cause de la manière dont l'instruction en cours est écrite. – ZLK

Répondre

1

Oui, vérifiez:

CREATE TABLE Test (Id int) 
GO 

CREATE TABLE IDownload (FileTitle nvarchar(100)) 

DECLARE @strSQL nvarchar(max) 
DECLARE @Search nvarchar(max) = 'a'') DROP TABLE Test --' 

SET @strSQL = 'SELECT 1 FROM IDownload WHERE 1 = 1 ' 

SET @strSQL = @strSQL + 'AND (IDownload.FileTitle LIKE ''%'[email protected]+'%'' ) '  

PRINT @strSQL 
EXEC sp_executesql @strSQL 

DROP TABLE IDownload 

Je drop table Test passer chaîne spéciale dans @Search. Réécrivez votre code en utilisant la procédure sp_executesql et les paramètres.

+0

Mais comment est-ce que je devrais reformuler l'instruction semblable à quelque chose qui est preuve d'Injection de SQL? J'ai regardé sur Internet et tout l'exemple semble être similaire à celui que vous avez posté. J'utilise déjà sp_executesql et paramdefinition dans mon code. –