字符串生成器 SELECT 查询变量是否带有撇号
String builder SELECT query when a variable has an apostrophe
我的一位同事创建了一个程序,该程序读取文本文件并将其中的各种值分配给 SQL 语句中使用的变量。
这些变量之一,gsAccounts
是一个字符串变量。
使用字符串生成器,正在使用 sql.append
构建 SELECT
语句。在字符串的末尾,有以下行:
sql.Append(" WHERE L.Account_Code IN(" & gsAccounts & ")"
我遇到的问题是有时,并非总是如此,gsAccounts
(帐户代码列表)可能包含带有撇号的帐户代码,因此查询变为
"WHERE L.Account_Code IN('test'123')"
账户代码为test'123
我曾尝试使用双引号以 "WHERE L.Account_Code IN("""" & gsAccounts & """")"
方式绕过它(使用 4 和 6 " 并排使用,但均无效)
我该如何解决这个问题? account_Code 是 table 中的主键,所以我不能删除它,因为它有多年的交易价值和数据与之相关。
单引号可以 "escaped" 通过将它们变成双单引号。例如。 '
变为 ''
。
然而,由于 SQL 注入的高风险 - 一个非常危险和普遍的问题,通常不推荐这种方法。参见:https://www.owasp.org/index.php/SQL_Injection
为了避免这种情况,大多数库将包含某种类型的转义机制,包括在 Java 世界中使用准备好的语句之类的东西。在 .net 世界中,这可能有用:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare(v=vs.110).aspx
如果您只有一个字段,这是最简单的解决方案
Private Function gsAccountsConvert(ByVal gsAccounts As String)
Dim gsAccountsString As String = ""
Dim StringTemp
StringTemp = gsAccounts.Split(",")
Dim i As Integer
For i = 0 To UBound(StringTemp)
StringTemp(i) = StringTemp(i).ToString.Trim
If StringTemp(i) <> "" Then
If StringTemp(i).ToString.Substring(0, 1) = "'" Then
StringTemp(i) = """" & StringTemp(i).ToString.Substring(1, Len(StringTemp(i).ToString) - 2) & """"
End If
End If
If i <> UBound(StringTemp) Then
gsAccountsString = gsAccountsString & StringTemp(i).ToString.Replace("'", "''") & ","
Else
gsAccountsString = gsAccountsString & StringTemp(i).ToString.Replace("'", "''") & ""
End If
Next
gsAccountsString = gsAccountsString.Replace("""", "'")
Return gsAccountsString
End Function
我在10年前发布了下面的例子here,几乎到了今天。 (糟糕!以为是 6 月 5 日,但实际上是 1 月 5 日。10.5 年后。)
Dim connection As New SqlConnection("connection string here")
Dim command As New SqlCommand
Dim query As New StringBuilder("SELECT * FROM MyTable")
Select Case Me.ListBox1.SelectedItems.Count
Case 1
'Only one item is selected so we only need one parameter.
query.Append(" WHERE MyColumn = @MyColumn")
command.Parameters.AddWithValue("@MyColumn", Me.ListBox1.SelectedItem)
Case Is > 1
'Multiple items are selected so include a parameter for each.
query.Append(" WHERE MyColumn IN (")
Dim paramName As String
For index As Integer = 0 To Me.ListBox1.SelectedItems.Count - 1 Step 1
'Name all parameters for the column with a numeric suffix.
paramName = "@MyColumn" & index
'Add a comma before all but the first value.
If index > 0 Then
query.Append(", ")
End If
'Append the placeholder to the SQL and add the parameter to the command
query.Append(paramName)
command.Parameters.AddWithValue(paramName, Me.ListBox1.SelectedItems(index))
Next index
query.Append(")")
End Select
command.CommandText = query.ToString()
command.Connection = connection
我的一位同事创建了一个程序,该程序读取文本文件并将其中的各种值分配给 SQL 语句中使用的变量。
这些变量之一,gsAccounts
是一个字符串变量。
使用字符串生成器,正在使用 sql.append
构建 SELECT
语句。在字符串的末尾,有以下行:
sql.Append(" WHERE L.Account_Code IN(" & gsAccounts & ")"
我遇到的问题是有时,并非总是如此,gsAccounts
(帐户代码列表)可能包含带有撇号的帐户代码,因此查询变为
"WHERE L.Account_Code IN('test'123')"
账户代码为test'123
我曾尝试使用双引号以 "WHERE L.Account_Code IN("""" & gsAccounts & """")"
方式绕过它(使用 4 和 6 " 并排使用,但均无效)
我该如何解决这个问题? account_Code 是 table 中的主键,所以我不能删除它,因为它有多年的交易价值和数据与之相关。
单引号可以 "escaped" 通过将它们变成双单引号。例如。 '
变为 ''
。
然而,由于 SQL 注入的高风险 - 一个非常危险和普遍的问题,通常不推荐这种方法。参见:https://www.owasp.org/index.php/SQL_Injection
为了避免这种情况,大多数库将包含某种类型的转义机制,包括在 Java 世界中使用准备好的语句之类的东西。在 .net 世界中,这可能有用:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare(v=vs.110).aspx
如果您只有一个字段,这是最简单的解决方案
Private Function gsAccountsConvert(ByVal gsAccounts As String)
Dim gsAccountsString As String = ""
Dim StringTemp
StringTemp = gsAccounts.Split(",")
Dim i As Integer
For i = 0 To UBound(StringTemp)
StringTemp(i) = StringTemp(i).ToString.Trim
If StringTemp(i) <> "" Then
If StringTemp(i).ToString.Substring(0, 1) = "'" Then
StringTemp(i) = """" & StringTemp(i).ToString.Substring(1, Len(StringTemp(i).ToString) - 2) & """"
End If
End If
If i <> UBound(StringTemp) Then
gsAccountsString = gsAccountsString & StringTemp(i).ToString.Replace("'", "''") & ","
Else
gsAccountsString = gsAccountsString & StringTemp(i).ToString.Replace("'", "''") & ""
End If
Next
gsAccountsString = gsAccountsString.Replace("""", "'")
Return gsAccountsString
End Function
我在10年前发布了下面的例子here,几乎到了今天。 (糟糕!以为是 6 月 5 日,但实际上是 1 月 5 日。10.5 年后。)
Dim connection As New SqlConnection("connection string here")
Dim command As New SqlCommand
Dim query As New StringBuilder("SELECT * FROM MyTable")
Select Case Me.ListBox1.SelectedItems.Count
Case 1
'Only one item is selected so we only need one parameter.
query.Append(" WHERE MyColumn = @MyColumn")
command.Parameters.AddWithValue("@MyColumn", Me.ListBox1.SelectedItem)
Case Is > 1
'Multiple items are selected so include a parameter for each.
query.Append(" WHERE MyColumn IN (")
Dim paramName As String
For index As Integer = 0 To Me.ListBox1.SelectedItems.Count - 1 Step 1
'Name all parameters for the column with a numeric suffix.
paramName = "@MyColumn" & index
'Add a comma before all but the first value.
If index > 0 Then
query.Append(", ")
End If
'Append the placeholder to the SQL and add the parameter to the command
query.Append(paramName)
command.Parameters.AddWithValue(paramName, Me.ListBox1.SelectedItems(index))
Next index
query.Append(")")
End Select
command.CommandText = query.ToString()
command.Connection = connection