当前位置: 首页 > 面试题库 >

在SQL参数化查询中转义单引号'

吴凯泽
2023-03-14
问题内容

我正在尝试在vb.net中使用sql查询插入数据,如下所示。名称= corp int’l poc = 1

当我尝试插入时,出现错误(“字符串’“之后的未封闭的引号)。当我尝试仅用1个单引号插入名称时,就会发生这种情况。

因此,我添加了一个replace函数,以将2个单引号替换为1个单引号来转义符号。没有错误,但是当我查看数据库时,添加了2个单引号而不是1个。

谁能告诉我如何通过参数化查询来避免使用单引号?谢谢!

 Public Function InsertData(ds As DataSet) As Boolean
    Dim cmd As New SqlCommand
    Dim cmd1 As New SqlCommand
    Dim status As Boolean
    Dim name As String
    Dim poc As String

    Dim id_p As New SqlParameter("id", SqlDbType.VarChar)
    Dim name_p As New SqlParameter("name", SqlDbType.VarChar)

    cmd.Parameters.Add(id_p)
    cmd.Parameters.Add(name_p)

    For i = 0 To ds.Tables(0).Rows.Count - 1

        If checkExists(ds.Tables(0).Rows(i)(1).ToString(), ds.Tables(0).Rows(i)(2).ToString(), ds.Tables(0).Rows(i)(3).ToString()) = True Then


            name = ds.Tables(0).Rows(i)(1).ToString()
            poc = ds.Tables(0).Rows(i)(2).ToString()

            If name.Contains("'") Then
                name = name.Replace("'", "''")
            End If
            If poc.Contains("'") Then
                poc = poc.Replace("'", "'")
            End If

            name_p.SqlValue = name
            id_p.SqlValue = poc


            cmd.CommandText = "INSERT INTO Code (Name,ID)" _
                              & " VALUES (@name,@id)"

            status = ExecuteNonQuerybySQLCommand(cmd)
        End If
    Next

    Return status

End Function


Dim strcon As String = "Data Source=x.x.x.x,1433;Network Library=DBMSSOCN;Initial Catalog=code_DB;User ID=xxx;Password=xxx;"

 Public Function ExecuteNonQuerybySQLCommand(ByVal cmd As SqlCommand) As Boolean
    Dim sqlcon As New SqlConnection
    Dim i As Integer = 0

    sqlcon.ConnectionString = strcon
    cmd.Connection = sqlcon

    Try
        sqlcon.Open()
        i = cmd.ExecuteNonQuery()
        sqlcon.Close()

        If i > 0 Then
            Return True
        Else
            Return False
        End If

    Catch ex As Exception
        Console.Write(ex)
        Return False
    End Try
End Function

问题答案:

作为参数传递的值(即SqlParameter对象)不需要转义。这是因为客户端API使用RPC调用来执行查询,而查询本身和参数是分别传递的。通过RPC调用,实际参数值将通过TDS协议以本机(二进制)格式发送到SQL
Server,而不是嵌入到语句中。这样可以减轻SQL注入的顾虑,并提供其他好处,例如强类型化和改进的性能。



 类似资料:
  • 问题内容: 我正在使用CodeIgniter将一些数据插入MySQL表中。因为我正在使用并且不想编辑活动记录类以启用此功能,所以我正在手动生成SQL查询。 问题: 当字符串中包含单引号时,查询失败。如何使这些需要转义的字符自动转义,例如使用活动记录时? 问题答案: 另一种方法是使用查询绑定,该绑定会自动转义所有值:

  • 问题内容: 我有一个存储在列表中的关键字列表。 要从表中获取记录,请使用以下查询: 您可能已经注意到,我的查询容易受到sql注入的攻击,因此我想通过SqlCommand()使用参数。我已经尝试了以下方法,但仍然无法正常工作: 我在哪里犯错,或者应该怎么做? 问题答案: 您在这里做错了几件事: 您为所有参数赋予相同的名称。那行不通。参数需要唯一的名称。 您为每个项目创建一个新的SqlCommand。

  • 问题内容: 我一直在试图弄清楚为什么以下代码未在我的ResultSet中生成任何数据: 另一方面,以下各项可以正常运行: SCHOOL的数据类型为CHAR(9字节)。除了setString,我还尝试了: 我完全留意接下来要研究什么;Eclipse调试器说,即使在setString或setCharacterStream之后,SQL查询也不会更改。我不确定这是因为设置参数不起作用,还是调试器根本无法在

  • 问题内容: 我使用的是codeigniter,大多数时候都使用活动记录进行查询(这会自动使它们转义),但是由于变量的原因,该查询似乎不太适合它。因此,我需要弄清楚如何手动转义查询。 Codeigniter文档建议以这种方式转义查询: 我的原始查询 我逃脱的查询 但是我在正确使用语法上遇到了麻烦。错误消息是: PHP错误消息:未定义的变量:user_language SQL错误:语法错误…在第1行的

  • 问题内容: 我正在尝试将一些文本数据放入9中的表中。 文本包含一个单引号(’)。 我该如何逃避呢? 我尝试使用两个单引号,但是这给我带来了一些错误。 例如。 问题答案: *就像您在示例中向我们展示的一样, *通过将单引号加倍将其转义 。以下SQL说明了此功能。我在SQL Server 2008上对其进行了测试: 结果

  • 问题内容: 我有一个要在Java中运行的查询: 它可以让我的应用程序连接并使用与论坛相同的用户名/密码。 它的工作,但当包含字符时会给出错误: 我将如何用Java编写此查询来满足’(如果存在)而不是(如果不存在)? 问候。 问题答案: 如果我遵循您的问题,那么您可以使用类似的方法- 另一种可能的解决方案是在Java中执行哈希和盐运算- 最后,我不会在2014年使用MD5。我更喜欢SHA-256。