Je me rends compte que les requêtes SQL paramétrées sont le meilleur moyen d'assainir l'entrée de l'utilisateur lors de la construction de requêtes qui contiennent l'entrée de l'utilisateur, mais je me demande ce qui est mal de prendre l'entrée de l'utilisateur et d'échapper tous les guillemets simples et d'entourer toute la chaîne de caractères avec des guillemets simples. Voici le code :
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Tous les guillemets simples que l'utilisateur saisit sont remplacés par des guillemets doubles, ce qui élimine la possibilité pour l'utilisateur de terminer la chaîne de caractères, de sorte que tout ce qu'il peut saisir, comme les points-virgules, les pourcentages, etc.
Nous utilisons Microsoft SQL Server 2000, pour lequel je crois que le guillemet simple est le seul délimiteur de chaîne et le seul moyen d'échapper au délimiteur de chaîne. Il n'y a donc aucun moyen d'exécuter tout ce que l'utilisateur tape.
Je ne vois aucun moyen de lancer une attaque par injection SQL contre ce système, mais je me rends compte que si ce système était aussi infaillible qu'il me semble, quelqu'un d'autre y aurait déjà pensé et ce serait une pratique courante.
Quel est le problème avec ce code ? Y a-t-il un moyen de faire passer une attaque par injection SQL au-delà de cette technique d'assainissement ? Un exemple d'entrée utilisateur qui exploite cette technique serait très utile.
UPDATE :
Je ne connais toujours pas de moyen de lancer efficacement une attaque par injection SQL contre ce code. Quelques personnes ont suggéré qu'une barre oblique inversée permettrait d'échapper à une apostrophe et de laisser l'autre à la fin de la chaîne de manière à ce que le reste de la chaîne soit exécuté dans le cadre de la commande SQL, et je réalise que cette méthode fonctionnerait pour injecter du SQL dans une base de données MySQL, mais dans SQL Server 2000, le seul moyen (que j'ai pu trouver) d'échapper à une apostrophe est d'utiliser une autre apostrophe ; les barres obliques inversées ne le font pas.
Et à moins qu'il n'existe un moyen d'empêcher l'échappement du guillemet simple, aucune des autres entrées de l'utilisateur ne sera exécutée car elles seront toutes considérées comme une seule chaîne contiguë.
Je comprends qu'il existe de meilleurs moyens d'assainir les entrées, mais je suis vraiment plus intéressé à savoir pourquoi la méthode que j'ai fournie ci-dessus ne fonctionne pas. Si quelqu'un connaît un moyen spécifique de monter une attaque par injection SQL contre cette méthode d'assainissement, je serais ravi de le voir.
21 votes
@BryanH Admettre ne pas comprendre comment la sagesse communément admise s'applique à un cas spécifique et demander un exemple sur ce cas spécifique n'est pas de l'orgueil, c'est de l'humilité. En revanche, s'énerver lorsque quelqu'un demande un exemple expliquant pourquoi la sagesse communément admise a raison peut passer pour de l'arrogance. Raisonner à l'aide d'exemples spécifiques est souvent un excellent moyen d'enquêter et d'apprendre. La façon dont le PO a abordé ce doute a été très utile pour ma compréhension du sujet, en particulier lorsqu'il a expliqué la réponse qu'il a trouvée.
0 votes
@patrik Je viens de tomber sur ce sujet alors que je travaille sur le même morceau de code mais en essayant d'échapper la chaîne de caractères et d'imbriquer une requête. Avez-vous trouvé la solution ?
1 votes
@3therk1ll il vaut mieux ne pas essayer, il est préférable d'utiliser le SQL paramétré : blog.codinghorror.com/
0 votes
@Patrick, je l'aborde du point de vue des attaquants !