转义 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
首先,我知道我现在应该使用存储过程并且正在着手使用它,但我需要快速修复我的一个内部应用程序。
有一个表格,我们可以在其中输入一些文本,它附加在 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