Comment peut-assainissement qui s'échappe des apostrophes être vaincu par injection SQL dans SQL Server?

Pour amorcer ce processus, je suis bien conscient que les requêtes paramétrées sont la meilleure option, mais je me demande ce qui rend la stratégie que je présente ci-dessous vulnérables. Les gens insistent ci-dessous la solution ne fonctionne pas, donc je suis de regarder pour un exemple de pourquoi il ne serait pas.

Si le SQL dynamique est construit dans le code à l'aide de la suite à s'échapper avant d'être envoyé à un Serveur SQL server, ce type d'injection peut vaincre ce?

string userInput= "N'" + userInput.Replace("'", "''") + "'"

Une question semblable a été répondu ici, mais je ne crois pas que les réponses sont ici applicables.

Échapper l'apostrophe avec un "\" n'est pas possible dans SQL Server.

Je crois SQL Contrebande avec Unicode (décrites ici) serait contrarié par le fait que la chaîne est produit est marqué comme Unicode par le N précédant l'apostrophe. Autant que je sache, il n'y a pas d'autres jeux de caractères SQL Server traduirait automatiquement à un seul devis. Sans non échappés apostrophe, je ne crois pas que l'injection est possible.

Je ne crois pas la Troncature de Chaîne est viable vecteur soit. SQL Server ne sera certainement pas faire la troncature depuis la taille maximale pour un nvarchar est de 2 go selon microsoft. 2 GO de chaîne est impossible dans la plupart des situations, et de l'impossible dans la mienne.

Second Ordre Injection pourrait être possible, mais est-il possible si:

  1. Toutes les données dans la base de données est désinfecté à l'aide de la méthode ci-dessus
  2. Valeurs de la base de données ne sont jamais ajouté SQL dynamique (pourquoi vous le faites jamais de toute façon, quand vous pouvez simplement référence à la valeur de la table dans la partie statique de toute chaîne SQL dynamique?).

Je ne dis pas que c'est mieux que la ou une alternative à l'utilisation de requêtes paramétrées, mais je veux savoir comment ce que j'ai décrit est vulnérable. Des idées?

  • Pas de. Vous êtes toujours sensible aux attaques de la forme: "SELECT * FROM MyTable WHERE Field = " + userInput quand userInput est 0; DROP TABLE OhNo;.
  • Cela n'a aucun sens. Dans l'exemple ci-dessus, votre entrée utilisateur serait aseptisé pour N'0; DROP TABLE OhNo;' avant même d'être exécuté.
  • Si pour l'assainissement des variables de chaîne seulement. Des choses comme "int" n'ont pas besoin d'être désinfectés s'ils sont exprimés comme un int avant d'être ajoutés à la requête. Peu importe, je ne demande qu'à propos de la désinfection des chaînes de la droite maintenant. Aussi, il n'est pas nécessaire impoli ici. Si vous pouvez penser à un moyen que ce n'est pas sûr, j'aimerais savoir.
  • Ok, comment sur userinput = "test"; drop table ohno; print""
  • Le seul quores sont transformés en deux guillemets simples (c'est comment vous échapper les guillemets simples), renderign inoffensifs. Votre saisie de l'utilisateur devient alors: N'test"; drop table ohno; print " qui est inoffensif
  • Pas une question intéressante qu'il y a zéro avantages de votre approche vs aide d'une requête paramétrée. Il y a plusieurs inconvénients incluent excessive des compilations et plan de cache de la météorisation.
  • Aussi, si la colonne de la table n'est pas unicode, vous allez empêcher l'utilisation des index sur les colonnes en raison de la conversion implicite.
  • Il n'y a absolument pas de scénario où il vous serait en mesure de faire de l'entrée de l'assainissement, et de ne pas être capable d'écrire de la requête paramétrée. Si vous en savez assez sur schéma de base de données pour être en mesure de vérifier les entrées vous-même, alors vous en savez assez pour écrire paramétrées requête. Choix évident est paramétrisée requête parce que résultant code sera plus propre, moins sujettes à des erreurs et accidentelle des problèmes de sécurité lorsque le code responsable n'est pas prudent.
  • Ne serait-ce pas un bon choix lorsque le SQL dynamique est inévitable?
  • Il y a des raisons quand littéral de l'analyse est nécessaire. Imaginez que vous êtes le traitement d'une liste de chaînes de caractères de longueur inconnue et la nécessité de générer une instruction SQL à faire: SELECT x à partir de y où le texte dans ('A', 'B', 'C', ...) La seule façon d'écrire cette déclaration dynamiquement et de manière efficace avec des littéraux. GBleaney de la méthode est sûre, on dirait qu'il est écrit de code C# qui est en unicode, le .Net pilote unicode et il n'y a rien de mal à cela.
  • Je peux toujours créer le sql avec la nécessaire ? pour les paramètres et fournir les paramètres séparément. Surtout depuis que je dois faire certaine analyse de toute façon puisque la longueur d'un "à la" clause est limitée dans de nombreux SGBDR.
  • Oui, vous pouvez créer une dynamique de chaîne de requête et de la place des marqueurs de paramètres au lieu de littéraux.
  • C'est une question intéressante lorsque le code en question est de plus de 25 ans et difficiles à rénover avec des requêtes paramétrées.

InformationsquelleAutor GBleaney | 2013-03-21