首先我知道我现在应该使用存储过程并且正在解决它,但是我需要快速修复我的一个内部应用程序。
这是我们可以输入一些文本的表单,该文本附加到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!提前谢谢!
答案 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