转义 MySQL 中的特殊字符

Escaping special characters in MySQL

首先,我知道我现在应该使用存储过程并且正在着手使用它,但我需要快速修复我的一个内部应用程序。

有一个表格,我们可以在其中输入一些文本,它附加在 HTML 电子邮件中,格式很好,然后发送给 joe 客户,然后再记录在 mysql 数据库中。

问题是每当用户使用撇号 (') 时,记录到 db 位就会失败。

我试图通过一个转义函数来绕过它,该函数只是将“替换为 /”,但我的 mysql 错误仍然存​​在。

我的转义函数是这样的..

Public Function escapechars(ByVal input As String) As String

    input = input.Replace("\", "\")
    input = input.Replace("%", "\%")
    input = input.Replace("'", "\'")
    input = input.Replace("", " \_")

    Return input

End Function

我保存到数据库的函数是这样的... (请记住,在构建 db_newvalues 之前我正在做 'escapechars')

 Public Function writesql(ByVal db_table As String, ByVal db_columns As String, ByVal db_newvalues As String)
    Control.CheckForIllegalCrossThreadCalls = False
    Try
        Dim cn As New MySqlConnection
        cn.Close()
        Dim timestamp As String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
        Dim myCommand As New MySqlCommand
        Dim myAdapter As New MySqlDataAdapter
        Dim SQL As String
        cn.ConnectionString = orca_connection_string
        myCommand.Connection = cn
        cn.Open()
        myAdapter.SelectCommand = myCommand
        SQL = ("INSERT INTO " & db_table & "(" & db_columns & ") VALUES (" & db_newvalues & "); SELECT LAST_INSERT_ID()")
        myCommand.CommandText = SQL
        Dim newentryid As Integer = myCommand.ExecuteScalar()
        cn.Close()
        Return newentryid
    Catch ex As Exception
        ErrorHandling(ex.ToString)
        Return "Error"
    End Try

End Function

任何帮助都适用!提前致谢!

在 MySQL 语句的字符串文字中,反斜杠字符和单引号字符可以通过在前面加上反斜杠字符来转义。例如:

 SELECT 'here\'s a \ backslash'

如果使用单引号将字符串文字括起来,那么文字中的一个单引号可以编码为两个单引号。例如。

 SELECT 'it''s fine like this too'

MySQL 扩展了 ANSI SQL 标准并允许使用双引号将字符串文字括起来,只要 sql_mode 未设置为包含 ANSI_QUOTES。如果我们用双引号将字符串文字括起来,则需要对文字中的双引号进行转义。


在 SQL 字符串文字中,无需转义下划线或百分号字符。 (只有在 LIKE 比较的上下文中,% 和 _ 字符才是通配符;如果我们希望对这些字符进行匹配,我们只需要将它们转义,"escape" 字符就不会被识别为通配符。)

对于动态生成的调试问题,请考虑记录 SQL 字符串的内容,然后在另一个客户端中测试 SQL。


注意:writesql 函数似乎容易受到 SQL 注入攻击。防止 SQL 注入需要成为调用 writesql.

的每个函数的责任

缓解 SQL 注入漏洞的首选模式是使用 准备好的语句 绑定占位符 。 (在 VB.NET 中,这将是一个带参数的命令对象。)

https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet