Éviter l'injection SQL à l'aide d'une requête non paramétrée

Je sais comment les requêtes paramétrées fonctionnent, et je les ai utilisées dans toutes les requêtes non codées que j'ai écrites jusqu'ici, mais en écrivant une fonction pour créer une requête dynamic (à des fins de test), je me suis demandé si utiliser tel quel"

ssortingng sql = "SELECT * FROM Table WHERE"; ssortingng fullssortingng = "The quick brown fox jumped over"; ssortingng[] words = fullssortingng.Split(' '); foreach (ssortingng item in words) { sql = sql + " Column LIKE '%" + item + "%' AND"; } sql = sql.Remove(sql.Length - 3); 

Si je devais transformer ceci en une requête, le résultat serait

 SELECT * FROM Table WHERE Column LIKE '%the%' AND Column LIKE '%quick%' AND Column LIKE '%brown%' AND Column LIKE '%fox%' AND Column LIKE '%jumped%' AND Column LIKE '%over%' 

Maintenant, je suis toujours sûr que cela est toujours ouvert aux attaques par injection en raison de l'absence de parameters, mais je ne sais pas comment le délimiteur étant un caractère espace rendant des choses comme SELECT * FROM TABLE ou DROP TABLE impossible à écrire dans la string que chacun serait divisé en leurs propres strings à savoir. SELECT , * , FROM et TABLE

Quelqu'un peut-il m'éclairer davantage?

(Remarque, ne pas l'intention de l'utiliser comme une alternative aux parameters appropriés, juste essayer de comprendre)

 select"name"from"sys"."columns" 

Est un exemple d'une requête que je peux écrire que SQL Server va traiter et qui ne contient aucun espace.

Alors, dites non.


Voici un autre exemple montrant une autre façon de contourner "pas d'espaces" et sous une forme "injectée":

 select name from sys.columns where name like '%a'union/**/all/**/select/**/name/**/from/**/sys.objects 

Si la string a été formatée comme ça:

 ssortingng fullssortingng = "DROP\tTABLE\tTableName"; 

vous auriez toujours un problème avec l'injection … Juste un exemple simple.