апостроф, вызывающий сбой SQL UPDATE - PullRequest
0 голосов
/ 07 декабря 2011

У меня проблема с апострофами при обработке обновлений запросов SQLCommand. У меня есть сетка, которая принимает отредактированный текст, который может содержать апострофы и другие подобные символы ударения.

UPDATE продолжает выдавать ошибки в апострофах во введенном тексте, что приводит к сбою SQL UPDATE.

Вот код:

Dim lbl1 As Label = GridView3.Rows(e.RowIndex).Cells(0).FindControl("Label1")
IDVal = lbl1.Text

' New translation
Dim TB1 As TextBox = GridView3.Rows(e.RowIndex).Cells(0).FindControl("TextBox1")
updateString = TB1.Text
updateString = HttpUtility.HtmlAttributeEncode(updateString)

' Brief Description
Dim TB2 As TextBox = GridView3.Rows(e.RowIndex).Cells(0).FindControl("TextBox2")
newBrief = TB2.Text

If newBrief = "" Then
    newBrief = DBNull.Value.ToString
Else
   newBrief = TB2.Text
End If

'    update the corresponding string value for Record
rootTableUpdate = "UPDATE " + userTable + " SET lang_String = '" + updateString + "', date_Changed ='" + myDate + "', prev_LangString = '" + Session("oldString") + "', brief_Descrip = '" + newBrief + "', needsTranslation = 'False', submittedBy= '" + userName + "' WHERE [Id] = " + IDVal + ";"

Dim command1 As New SqlCommand(rootTableUpdate, connection)
connection.Open()
command1.ExecuteNonQuery()
connection.Close()

Слово, которое ошибка приведена ниже, на самом деле: d'alimentation.

Неверный синтаксис рядом с «пищей»
Незакрытая кавычка после символьной строки 'WHERE [Id] = 258;'.
Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении:

System.Data.SqlClient.SqlException: неправильный синтаксис рядом с 'alimentation'.
Незакрытая кавычка после символьной строки 'WHERE [Id] = 258;'.

Ошибка источника:

Line 164:            Dim command1 As New SqlCommand(rootTableUpdate, connection)
Line 165:            connection.Open()
Line 166:            command1.ExecuteNonQuery()

SQEE, VB.net

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Ваш код склонен к SQL-инъекции .

Использовать параметризованные запросы.

Dim cmd As New SqlCommand("UPDATE Table SET ColA=@ColA, ColB=@ColB", Conn)
cmd.Parameters.Add("@ColA", SqlDbType.Int).Value = ColA
cmd.Parameters.Add("@ColB", SqlDbType.Int).Value = ColB
cmd.ExecuteNonQuery()

Это также предотвратит проблемы с апострофом.

2 голосов
/ 07 декабря 2011

Если вы параметризуете вызов (как пример @ Curt), а не объединяете строки:

  • , у вас не будет этой проблемы
  • , вы будете безопаснее против SQL-инъекция атаки
1 голос
/ 08 декабря 2011

Вы должны использовать параметризованные запросы вместо конкатенации строки.

Это позволит избежать проблемы, с которой вы столкнулись, и поможет защитить от SQL-инъекций .

Iможет видеть, что вы передаете имя таблицы, поэтому вам нужно использовать динамический SQL - вам нужно экранировать любой одиночный ', удваивая его, иначе он будет действовать как терминатор строки.

Вам все еще нужно принять меры против SQL-инъекций - простое удвоение апострофов не поможет в этом отношении.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...