10
votes

Escape une chaîne (Ajouter des barres obliques) dans vb.net?

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 + "'"


0 commentaires

6 Réponses :


2
votes

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.


0 commentaires

2
votes

Ne construisez pas une chaîne pour exécuter comme ça.
C'est exactement pourquoi les attaques d'injection SQL sont possibles.

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.


0 commentaires

16
votes

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:

option 1 (non recommandé pour ce scénario): Faites un simple remplacement. C'est à dire. xxx

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

par exemple: xxx


6 commentaires

cmd.parameters.addwithvalue ("@ clientId", client) est également disponible.


Vous devez vraiment envelopper le sqlconnection et sqlcommand dans un en utilisant 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 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.



5
votes

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?

Le meilleur n'est pas d'échapper aux cordes du tout, mais d'utiliser une requête paramétrée. Exemple: xxx


0 commentaires

1
votes

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("/", "//")


0 commentaires

1
votes

Alors voudriez ajouter un petit avis sur les noms de paramètres à l'aide de system.data.odbc.odbccommand code>, Selon http://msdn.microsoft.com/fr -us / bibliothèque / system.data.odbc.odbccommand.commandtype

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 >

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


0 commentaires