Question très simple (surprenante, je ne peux pas trouver une question similaire nulle part): comment puis-je échapper aux données de formulaire dans vb.net? J'ai différentes lignes comme ceci:
Dim query As String = "exec sp_Message_insert @clientid='" + pClientId + "', @message='" + pMessage + "', @takenby='" + pUserId + "', @recipients='" + pRecipients + "'"
6 Réponses :
Je pense que vous pouvez simplement faire deux apostrophes pour créer celui-ci. Je m'excuse si cela ne fonctionne pas, cela a été un moment depuis que je l'ai fait de cette façon, je vous suggérerais d'utiliser des paramètres SQL, cela gérera automatiquement vos caractères spéciaux et empêchera l'injection SQL. P>
Ne construisez pas une chaîne pour exécuter comme ça.
C'est exactement pourquoi les attaques d'injection SQL sont possibles. P>
Utilisez plutôt une couche d'accès aux données, ce qui vous permet de créer des objets de paramètre et de les associer à la procédure stockée à exécuter. P>
Qu'est-ce que tu veux dire exactement en s'échappant? Vb.net n'a pas de "échapper" de la même manière que les langues de style c.
Maintenant, si vous voulez vous assurer qu'il n'y a pas de qoutes mono-qoutes dans la variable PClientid, vous avez deux options: P>
option 1 (non recommandé pour ce scénario): Faites un simple remplacement. C'est à dire. p> mais, comme indiqué, je ne ferais pas cela pour ce qui semble être une commande SQL. Ce que je ferais, c'est
Option 2: Utilisez les paramètres de données pour passer des paramètres sur votre DB lors de commandes SQL P> par exemple: p>
cmd.parameters.addwithvalue ("@ clientId", client) code> est également disponible.
Vous devez vraiment envelopper le sqlconnection code> et
sqlcommand code> dans un
en utilisant code> bloc: msdn.microsoft.com/en-us/library/htd05whh.aspx
Heh, dès que j'ai posté la question, je pensais que je devrais transmettre des données comme paramètres au lieu d'une chaîne. Blâmer mon ex-patron, c'est celui qui m'a appris à le faire de cette façon;) Je vais utiliser la première méthode pour l'instant i> puisque le client le souhaite rapidement, mais je vais commencer à refactoriser tout de suite .
Quelle base de données utilisez-vous? Si vous n'échappez pas à l'ensemble de caractères correct, la requête est toujours large pour l'injection SQL.
Il ne devrait-il pas y avoir de cmd.prepare () là-bas avant d'exécuter? Sinon, qu'est-ce que c'est bien préparer ()?
Préparer () fixe essentiellement des erreurs types de données (c'est-à-dire la longueur d'une chaîne, vous pourrez donc que la commande SQL ne générera pas d'erreur «tronquée»). Le SQLParameter gère automatiquement l'échappement des caractères.
Si vous souhaitez échapper aux chaînes, vous devez d'abord dire quelle base de données vous utilisez. Vous devez utiliser l'évacuation correcte pour la base de données spécifique afin d'échapper à tous les caractères dont vous avez besoin, mais seulement ceux.
Je ne connais aucune base de données qui utilise Slash comme caractère d'échappement. MySQL utilise les barres obliques arrière, c'est peut-être ce que vous voulez dire? P>
Le meilleur n'est pas d'échapper aux cordes du tout, mais d'utiliser une requête paramétrée. Exemple: p>
Si vous souhaitez exécuter une chaîne en tant que requête, vous devez utiliser le code suivant:
Dim query as String query.Replace("/", "//")
Alors voudriez ajouter un petit avis sur les noms de paramètres à l'aide de Le fournisseur de données Framework .NET pour ODBC ne prend pas en charge le passage
Paramètres nommés à une instruction SQL ou à une procédure stockée appelée
par un ODBCCOMMAND. Dans l'un de ces cas, utilisez le point d'interrogation (?)
espace réservé. p>
BlockQuote> Un exemple d'ici http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparametercollection (v = vs.80) .aspx # y800 : p > system.data.odbc.odbccommand code>,
Selon http://msdn.microsoft.com/fr -us / bibliothèque / system.data.odbc.odbccommand.commandtype
Dim command As OdbcCommand = connection.CreateCommand()
command.CommandText = â{ call MoneyProcedure(?,?,?) â
command.Parameters.Add("", OdbcType.Int).Value = 1
command.Parameters.Add("", OdbcType.Decimal).Value = 2
command.Parameters.Add("", OdbcType.Decimal).Value = 3