Comment faire des requêtes paramétrées aider contre les injections SQL?
Dans les deux requêtes 1 et 2, le texte de la zone de texte est inséré dans la base de données. Quelle est la signification de la requête paramétrée ici?
-
Passant
txtTagNumber
comme un paramètre de requêteSqlCommand cmd = new SqlCommand("INSERT INTO dbo.Cars " +"VALUES(@TagNbr);" , conn); cmd.Parameters.Add("@TagNbr", SqlDbType.Int); cmd.Parameters["@TagNbr"].Value = txtTagNumber.Text;
-
Conversion
txtTagNumber
à un entier avant de construire la requêteint tagnumber = txtTagNumber.Text.ToInt16(); /* EDITED */ INSERT into Cars values(tagnumber.Text); /* then is it the same? */
Aussi, là, je voudrais utiliser une Expression Régulière pour la validation d'arrêter d'insertion des caractères illégaux.
- Pourquoi écrire votre propre validation, lorsque les requêtes paramétrées déjà résoudre le problème?
- En Plus de la validation est dur sur gratuit de saisie de texte, et les requêtes Paramétrées faire le bon "s'enfuir" ( le client fait passer les données directement sur le serveur ).
- pouvez-vous me donner un exemple de s'ÉCHAPPER?
- un !non valide! s'échapper serait par exemple de Chaîne.remplacer("'","""). Paramétrée à l'exécution de la commande, utiliser une autre forme de codage qu'il n'est pas nécessaire pour vous de savoir
- Double Possible de Pourquoi il faut toujours préférer l'utilisation de paramètres dans les requêtes SQL?
Vous devez vous connecter pour publier un commentaire.
Des requêtes paramétrées faire une substitution des arguments avant l'exécution de la requête SQL. Il supprime complètement la possibilité de "sale" entrée changer le sens de votre question. C'est, si l'entrée contient SQL, il ne peut pas devenir une partie de ce qui est exécuté becase le SQL n'est jamais injecté dans la déclaration.
injection sql qui se passe lorsqu'un paramètre a sql et les cordes ne sont pas traitées comme il se doit
par exemple:
et la condition est une chaîne de caractères en provenance de l'utilisateur dans la requête. Si la condition est malveillant
dire par exemple:
vous pourriez vous retrouver l'exécution de scripts malveillants.
mais en utilisant les paramètres de l'entrée sera nettoyé de tous les caractères qui pourraient s'échapper de la chaîne de caractères...
vous pouvez être assuré, peu importe ce qui arrive, ne sera pas en mesure d'exécuter injecter des scripts.
à l'aide de la commande de l'objet avec les paramètres sql exécuté ressemblerait à ceci
dans essense il sera à la recherche pour une ligne avec rowname = a';drop table mytable where 1=1'
et ne s'exécute pas le script restant
Prises de
Des requêtes paramétrées s'occupe de tout - pourquoi aller à la peine?
Avec des requêtes paramétrées, en plus générale de l'injection, vous bénéficiez de tous les types de données traitées, des chiffres (de type int et float), les cordes (avec des guillemets), les dates et les heures (pas de problèmes de mise en forme ou des problèmes de localisation lorsque .ToString() n'est pas appelé avec l'invariant de la culture et de votre client se déplace à une machine avec et inattendu format de la date).
Des requêtes paramétrées permettre au client de transmettre les données séparément forme le texte de la requête.
Où sur la plupart de libre à partir du texte que vous feriez de validation + échapper.
Bien sûr, le Paramétrage n'aident pas à l'encontre d'autres type d'injection, mais en tant que paramètre sont transmis séparément, ils ne sont pas les utiliser comme de l'exécution de requête de texte.
Une bonne analogie serait la "récente" de l'exécution de bits utilisé avec la plupart des modernes processeur et système d'Exploitation afin de les protéger de débordement de la mémoire tampon. Il permet néanmoins de le débordement de la mémoire tampon, mais aussi d'empêcher l'exécution de l'injection de données.
Il est assez facile de comprendre pourquoi on se sent si.
vs
Les deux requêtes semblent faire la même chose.Mais en fait ils ne le font pas.
Le premier utilise en entrée une requête, ce dernier décide de la requête, mais seuls les substituts les entrées que c'est au cours de l'exécution de la requête.
Pour être plus clair, les valeurs des paramètres sont situés quelque part sur la pile, où les variables de la mémoire est stockée et est utilisé pour la recherche en cas de besoin.
Donc, si nous devions donner
' OR '1'='1
que l'entrée dans le nom d'utilisateur, le premier, de dynamiquement la construction d'un nouveau requêtes ou des requêtes dans le cadre de la chaîne de requête sqlsqlQuery
qui est ensuite exécuté.Alors que sur la même entrée, dernier de recherche pour
' OR '1'='
dans leusername
domaine de lausers
table avec le statiquement requête spécifiée dans la chaîne de requêtesqlQuery
Juste pour le consolider, c'est la façon dont vous utilisez les paramètres de requêtes: