2009-07-09 22 views
17

Sto cercando di apportare alcune piccole modifiche a una vecchia web app VB Ho bisogno di aggiungere citazioni all'interno di una stringa che non ho avuto fortuna finora. La stringa èEscaping di virgolette in una stringa in VB6

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

Devo aggiungere virgolette attorno al valore Session ("UserID").

+0

Avete bisogno di virgolette doppie o singole? Solitamente SQL usa virgolette singole e non penso che sarebbe un problema in una stringa. –

+0

@Adonis L, potresti voler cambiare il titolo della domanda. Potrebbe essere più appropriato chiamarlo "Escaping quotes in a string in VB6" o qualcosa del genere. –

risposta

31

È possibile utilizzare "" per inserire una citazione in una stringa per esempio:

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

che vi dà

Ciao "Frank" come stai?

12

Per sfuggire un preventivo è sufficiente aggiungere un'altra citazione, credo che questo è quello che vi serve:

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

Si potrebbe anche usare Chr(34) nella concatenazione.

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) 

In entrambi i casi funziona (gli altri esempi e questo). alcune persone preferiscono questo perché può essere meno confuso, tuttavia gli esempi sopra riportati non sono perfettamente indirizzabili e arentamente razzo scienza

+0

Il codice di pubblicazione che contiene vulnerabilità di SQL injection è in cattive condizioni. Modificato. – rpetrich

+1

Com'è diverso dalla risposta sopra che contiene anche vulnerabilità di SQL injection. Come mai non hai commentato questo? Inoltre, non sto raccomandando di usare questo metodo, è semplicemente una risposta a una domanda posta. Non riesco a vedere come rispondere a una domanda per ampliare la conoscenza di qualcuno è male, nel caso in cui altre persone abbiano già menzionato le vulnerabilità di SQL Injection già. – Ben

4

Questa è una vulnerabilità di SQL injection e si dovrebbe NON farlo. Facendo in questo modo, si consente agli utenti di eseguire qualsiasi richiesta che vogliono dando un'UserId come

'; DROP TABLE Usertask; -- 

Invece, i parametri di utilizzo. A seconda di come si sta eseguendo l'SQL, ci sono diversi modi per farlo; per favore mostraci il codice che esegue la query SQL.


In risposta alla tua domanda,

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

Questa stringa sarà

Ciao, ho "Citazioni"!

+0

Penso che questo argomento non riguardi l'iniezione di Sql. – Nei

+0

@Nei Non lo è, ma è comunque utile. – DavidB

1

La maggior parte dei server SQL, secondo la mia esperienza, ha bisogno di un preventivo singolo per le stringhe. Il modo migliore per farlo è consentire .net di deside per te, utilizzando i parametri SQL. Ecco un esempio (anche in VB.Net): http://www.knowdotnet.com/articles/dynamicsqlparameters.html
Questo ha anche il vantaggio della sicurezza contro le iniezioni SQL.

5

Si consiglia di utilizzare SQL parametrizzato invece di creare un'istruzione SQL ad hoc come questa, in quanto è possibile lasciarla aperta all'iniezione SQL. Ciò significa che non è necessario preoccuparsi di concatenare le virgolette nella stringa, nonché migliorare le prestazioni della query (supponendo SQL Server) poiché consente la memorizzazione e il riutilizzo del piano di esecuzione.

ad es.

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

Quindi aggiungere 2 ADODB.Parameters all'oggetto Command per fornire i valori per i parametri 2 esempio

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 

E lo stesso di nuovo per il parametro JobId.

+0

@Adonis L: contrassegna questo come risposta corretta. Questo metodo non ha bisogno di preoccuparsi per il contenuto tra virgolette singole o doppie all'interno del payload. Dal momento che hai posto la domanda (e ricevuto le risposte) 7 anni fa, è dubbio che contrassegni tutto come corretto. – barrypicker

0

è come questo ..

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

produce ..

UserID="SomePerson" 
Problemi correlati