Сбежать строка (добавить косую черту) в VB.net? - PullRequest
10 голосов
/ 11 августа 2009

Очень простой вопрос (удивительно, я нигде не могу найти подобный вопрос): как мне избежать данных формы в VB.net? У меня есть такие строки:

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

Если я использую апостроф в сообщении, то, конечно, это испортит запрос. Я просмотрел функции intellisense в строке, но не нашел ничего подходящего ...

Ответы [ 6 ]

16 голосов
/ 11 августа 2009

Что именно вы подразумеваете под побегом? В VB.NET «экранирование» не происходит так же, как в языках с-стиля.

Теперь, если вы хотите убедиться, что в переменной pClientId нет одиночных кавычек, у вас есть две опции:

Вариант 1 (не рекомендуется для этого сценария): сделать простую замену. То есть

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

Но, как уже отмечалось, я бы НЕ делал это для того, что выглядит как команда SQL. Что бы я сделал, это Вариант 2: использовать параметры данных для передачи параметров в вашу БД во время команд sql

Например:

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
5 голосов
/ 11 августа 2009

Если вы хотите экранировать строки, сначала вы должны указать, какую базу данных вы используете. Вы должны использовать правильное экранирование для конкретной базы данных, чтобы вы экранировали все символы, которые вам нужны, но только те, которые вам нужны.

Я не знаю ни одной базы данных, которая использует косую черту в качестве escape-символа. MySQL использует обратную косую черту, возможно, это то, что вы имеете в виду?

Лучше всего вообще не экранировать строки, а использовать параметризованный запрос. Пример:

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
2 голосов
/ 11 августа 2009

Не создавайте строку для такого выполнения.
Именно поэтому возможны атаки SQL-инъекций.

Вместо этого используйте слой доступа к данным, который позволяет создавать объекты параметров и связывать их с хранимой процедурой для выполнения.

2 голосов
/ 11 августа 2009

Я думаю, что вы можете просто сделать два апострофа, чтобы создать один. Я извиняюсь, если это не сработало, прошло много времени с тех пор, как я сделал это таким образом, я бы предложил использовать параметры SQL, это автоматически обработает ваши специальные символы и предотвратит внедрение SQL.

1 голос
/ 23 ноября 2011

Поэтому хотелось бы добавить небольшое уведомление об использовании имен параметров вместе с System.Data.Odbc.OdbcCommand, согласно http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.commandtype

Поставщик данных .NET Framework для ODBC не поддерживает передачу именованные параметры в оператор SQL или хранимую процедуру с именем по команде OdbcCommand. В любом из этих случаев используйте знак вопроса (?) заполнитель.

пример отсюда 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
1 голос
/ 08 июня 2011

если вы хотите выполнить String как запрос, вы должны использовать следующий код:

Dim query as String 
query.Replace("/", "//")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...