转义MySQL中的特殊字符

时间:2017-03-06 20:33:25

标签: mysql vb.net escaping apostrophe

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

这是我们可以输入一些文本的表单,该文本附加到HTML电子邮件中,格式化得很好,然后在记录到mysql DB之前发送给joe客户。

问题在于,只要用户使用撇号('),对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

任何帮助appriciated!提前谢谢!

1 个答案:

答案 0 :(得分:1)

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

 SELECT 'here\'s a \\ backslash'

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

 SELECT 'it''s fine like this too'

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

在SQL字符串文字中,不需要转义下划线或百分号字符。 (只有在LIKE比较的上下文中,%和_字符才是通配符;如果我们想要匹配这些字符,我们只需要逃避那些,以“逃避”字符被识别为通配符。 )

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

注意:writesql函数似乎容易受到SQL注入攻击。防止SQL注入需要由调用writesql的每个函数负责。

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

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