2009-07-09 6 views
17

J'essaie de faire quelques petits changements à une ancienne application web VB J'ai besoin d'ajouter des citations à l'intérieur d'une chaîne que je n'ai pas eu de chance jusqu'à présent. La chaîne estÉchapper des citations dans une chaîne dans VB6

Dim sql As String = "Select * from Usertask Where UserId = " & Session("UserId") & " and JobID=" & ddlReqTask.SelectedValue 

Je dois ajouter des guillemets autour de la valeur Session ("UserID").

+0

Avez-vous besoin des guillemets doubles ou simples? Généralement SQL utilise des guillemets simples et je ne pense pas que ce serait un problème dans une chaîne. –

+0

@Adonis L, vous voudrez peut-être changer le titre de la question. Peut-être plus approprié de l'appeler "Escaping citations dans une chaîne dans VB6" ou quelque chose du genre. –

Répondre

31

Vous pouvez utiliser "" pour insérer une citation dans une chaîne par exemple:

dim sometext as String = "Hello ""Frank"" how are you?"

Ce qui vous donne

Bonjour "Frank" comment allez-vous?

12

Pour échapper à une citation que vous avez juste besoin d'ajouter une autre citation, je crois que c'est ce que vous avez besoin:

Dim sql As String = "Select * from Usertask Where UserId = """ & Session("UserId") & """ and JobID=" & ddlReqTask.SelectedValue 
4

Vous pouvez également utiliser Chr(34) dans la concaténation.

Dim sql As String = "Select * from Usertask Where UserId = " & Chr(34) & Replace(Session("UserId"), Chr(34), Chr(34) & Chr(34)) & Chr(34) & " and JobID=" & CLng(ddlReqTask.SelectedValue) 

De toute façon fonctionne (les autres exemples et celui-ci). certaines personnes préfèrent celui-ci car il peut être moins déroutant, cependant les exemples ci-dessus ne sont pas parfaits et ne fonctionnent pas.

+0

Le code de publication contenant des vulnérabilités d'injection SQL est incorrect. Édité. – rpetrich

+1

En quoi est-ce différent de la réponse ci-dessus qui contient également des vulnérabilités d'injection SQL. Comment se fait-il que vous ayez commenté cela? Aussi, je ne recommande pas d'utiliser cette méthode, c'est simplement une réponse à une question posée. Je ne vois pas comment répondre à une question pour élargir la connaissance de quelqu'un est mauvais, dans le cas où d'autres personnes ont déjà mentionné les vulnérabilités de SQL Injection. – Ben

4

Ceci est une vulnérabilité d'injection SQL et vous devriez NOT le faire. En ce faisant de cette façon, vous permettez à vos utilisateurs d'exécuter une requête qu'ils veulent en vous donnant un UserId comme

'; DROP TABLE Usertask; -- 

Au lieu de cela, les paramètres d'utilisation. Selon la façon dont vous exécutez le SQL, il existe différentes façons de le faire; s'il vous plaît nous montrer le code qui exécute la requête SQL.


En réponse à votre question,

Dim StringWithQuotes As String = "Hello, I've got ""Quotes""!" 

Cette chaîne sera

Bonjour, j'ai "Citations"!

+0

Je pense que ce sujet ne concerne pas l'injection Sql. – Nei

+0

@Nei Ce n'est pas le cas, mais c'est néanmoins utile. – DavidB

1

La plupart des serveurs SQL, selon mon expérience, ont besoin d'un guillemet simple pour les chaînes. La meilleure façon de le faire est de laisser .net desider pour vous, en utilisant les paramètres SQL. Voici un exemple (également dans VB.Net): http://www.knowdotnet.com/articles/dynamicsqlparameters.html
Cela a également l'avantage de la sécurité contre les injections SQL.

5

Je vous recommande d'utiliser le SQL paramétré au lieu de créer une instruction SQL adhoc comme celle-ci, car vous pourriez vous laisser ouvert à l'injection SQL. Cela signifie que vous n'avez pas besoin de vous soucier de concaténer les guillemets dans la chaîne, ainsi que d'améliorer les performances des requêtes (en supposant que le serveur sql) car cela permet la mise en cache et la réutilisation du plan d'exécution.

par exemple.

Dim sql As String = "Select * from Usertask Where UserId = ? AND JobID = ?" 

Ensuite, ajoutez 2 ADODB.Parameters à l'objet de commande pour fournir les valeurs des 2 paramètres par exemple

Set param = New ADODB.Parameter 
param.Name = "@UserId" 
param.Direction = adParamInput 
param.Type = adVarChar 
param.Size = (give size of user id field) 
param.value = Session("UserId") 
yourADOCommand.Parameters.Append param 

De même pour le paramètre JobId.

+0

@Adonis L - marquez celui-ci comme la bonne réponse. Cette méthode n'a pas besoin de s'inquiéter du contenu incluant des guillemets simples ou doubles dans la charge utile. Depuis que vous avez posé la question (et reçu des réponses) il y a 7 ans, il est douteux que vous allez marquer quelque chose comme correct. – barrypicker

0

c'est comme ça ..

dim user_id as string="SomePerson" 
debug.print "UserId=" & chr(34) & user_id & Chr(34) 

produit ..

UserID="SomePerson" 
Questions connexes