2009-08-11 46 views
10

Pregunta muy simple (sorprendentemente no puedo encontrar una pregunta similar en ninguna parte): ¿cómo puedo escapar datos de formulario en VB.net? Tengo varias líneas de este tipo:¿Escape una cadena (agregue barras) en VB.net?

Dim query As String = "exec sp_Message_insert @clientid='" + pClientId + "', @message='" + pMessage + "', @takenby='" + pUserId + "', @recipients='" + pRecipients + "'" 

Si utilizo un apóstrofe en el mensaje, entonces por supuesto que esto arruina la consulta. He buscado a través de las funciones intellisense en la cadena, pero no veo nada apropiado ...

Respuesta

16

¿Qué quiere decir exactamente escapando? VB.NET no tiene 'escape' de la misma manera que los lenguajes de estilo c.

Ahora, si usted quiere asegurarse de que no hay un solo-qoutes en la variable pClientId, entonces usted tiene dos opciones:

Opción 1 (no se recomienda para este escenario): hacen un reemplazo simple. Es decir.

pClientId = String.Replace(pClientId, "'","''") 

Pero, como se señaló, NO haría esto por lo que parece ser un comando SQL. Lo que yo haría es Opción 2: utilizar parámetros de datos para pasar parámetros a su base de datos durante comandos SQL

Por ejemplo:

Dim cn As New SqlConnection(connectionString) 
Dim cmd As New SqlCommand 
cn.Open 
cmd.Connection=cn 
cmd.CommandType=CommandType.StoredProcedure 
cmd.CommandText= "sp_Message_insert" 
cmd.Parameters.add(New SqlParameter("@clientid", pClientId) 
cmd.Parameters.add(New SqlParameter("@message", pMessage) 
cmd.Parameters.add(New SqlParameter("@takenby", pUserId) 
cmd.Parameters.add(New SqlParameter("@recipients", pRecipients) 
cmd.ExecuteNonQuery 
+1

'cmd.Parameters.AddWithValue ("@ ClientID", clientId)' también está disponible. –

+0

Realmente debería ajustar 'SqlConnection' y' SqlCommand' en un bloque 'Using': http://msdn.microsoft.com/en-us/library/htd05whh.aspx – LukeH

+0

Heh, tan pronto como publique la pregunta I pensé que debería pasar datos como parámetros en lugar de una cadena. Culpe a mi ex jefe, él es quien me enseñó a hacerlo de esta manera;) Voy a usar el primer método * por ahora * ya que el cliente quiere que esto se corrija rápidamente, pero comenzará a refactorizarse de inmediato. – DisgruntledGoat

2

Creo que puedes hacer dos apóstrofes para crear una. Me disculpo si eso no funciona, ha pasado un tiempo desde que lo hice de esa manera, sugiero usar los parámetros de SQL, esto manejará automáticamente sus caracteres especiales y evitará la inyección de SQL.

2

No construya una cadena para ejecutar de esa manera.
Es exactamente por eso que los ataques de inyección SQL son posibles.

En su lugar, utilice una capa de acceso a datos, que le permite crear objetos de parámetros y asociarlos con el procedimiento almacenado para ejecutar.

5

Si desea escapar de las cadenas entonces primero tiene que saber qué base de datos Tu estas usando. Debe usar el escape correcto para la base de datos específica para que pueda escapar de todos los caracteres que necesita, pero solo de esos.

No conozco ninguna base de datos que use barras como carácter de escape. MySQL usa barras diagonales inversas, ¿quizás eso es lo que quieres decir?

Lo mejor no es escapar de las cadenas en absoluto, sino utilizar una consulta parametrizada. Ejemplo:

Dim cmd As New SqlCommand("sp_Message_insert") 
cmd.Parameters.Add("@clientid").Value = pClientId 
cmd.Parameters.Add("@message").Value = pMessage 
cmd.Parameters.Add("@takenby").Value = pUserId 
cmd.Parameters.Add("@recipients").Value = pRecipients 
1

si se desea ejecutar una cadena como una consulta que debe utilizar el siguiente código:

Dim query as String 
query.Replace("/", "//") 
1

Así que le gustaría añadir una pequeña nota acerca de los nombres de los parámetros utilizando junto con System.Data.Odbc.OdbcCommand, de acuerdo con http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.commandtype

El proveedor de datos de .NET Framework para ODBC no admite pasar PARAMET llamado a una instrucción SQL o a un procedimiento almacenado llamado por un OdbcCommand. En cualquiera de estos casos, use el signo de interrogación (?) marcador de posición.

un ejemplo de aquí http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparametercollection(v=vs.80).aspx#Y800:

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 
Cuestiones relacionadas