在VB.net中转义字符串(添加斜杠)?
非常简单的问题(令人惊讶的是,我在任何地方都找不到类似的问题):如何在VB.net中转义表单数据?我有很多这样的句子:在VB.net中转义字符串(添加斜杠)?,vb.net,string,escaping,Vb.net,String,Escaping,非常简单的问题(令人惊讶的是,我在任何地方都找不到类似的问题):如何在VB.net中转义表单数据?我有很多这样的句子: Dim query As String = "exec sp_Message_insert @clientid='" + pClientId + "', @message='" + pMessage + "', @takenby='" + pUserId + "', @recipients='" + pRecipients + "'" 如果我在消息中使用撇号,那么这当然会使查
Dim query As String = "exec sp_Message_insert @clientid='" + pClientId + "', @message='" + pMessage + "', @takenby='" + pUserId + "', @recipients='" + pRecipients + "'"
如果我在消息中使用撇号,那么这当然会使查询出错。我已经查看了字符串上的intellisense函数,但没有看到任何合适的…我认为您可以只做两个撇号来创建一个。如果这样做不起作用,我很抱歉,我已经用这种方式做了一段时间了,我建议使用SQL参数,这将自动处理您的特殊字符并防止SQL注入。不要建立字符串以这样执行。
这就是为什么SQL注入攻击是可能的
而是使用一个数据访问层,它允许您创建参数对象并将它们与要执行的存储过程相关联。转义到底是什么意思?VB.NET不像c风格语言那样具有“转义” 现在,如果要确保pClientId变量中没有单个QOUTE,则有两个选项: 选项1(不推荐用于此场景):执行简单的替换。即
pClientId = String.Replace(pClientId, "'","''")
但是,如前所述,我不会对一个SQL命令执行此操作。我要做的是
选项2:使用数据参数在sql命令期间将参数传递给数据库
例如:
Dim cn As New SqlConnection(connectionString)
Dim cmd As New SqlCommand
cn.Open
cmd.Connection=cn
cmd.CommandType=CommandType.StoredProcedure
cmd.CommandText= "sp_Message_insert"
cmd.Parameters.add(New SqlParameter("@clientid", pClientId)
cmd.Parameters.add(New SqlParameter("@message", pMessage)
cmd.Parameters.add(New SqlParameter("@takenby", pUserId)
cmd.Parameters.add(New SqlParameter("@recipients", pRecipients)
cmd.ExecuteNonQuery
如果您想转义字符串,那么首先必须告诉您使用的是哪个数据库。必须对特定数据库使用正确的转义,以便转义所有需要转义的字符,但仅转义那些字符 我不知道有哪个数据库使用斜杠作为转义字符。MySQL使用反斜杠,也许这就是你的意思 最好的方法不是转义字符串,而是使用参数化查询。例如:
Dim cmd As New SqlCommand("sp_Message_insert")
cmd.Parameters.Add("@clientid").Value = pClientId
cmd.Parameters.Add("@message").Value = pMessage
cmd.Parameters.Add("@takenby").Value = pUserId
cmd.Parameters.Add("@recipients").Value = pRecipients
如果要将字符串作为查询执行,应使用以下代码:
Dim query as String
query.Replace("/", "//")
因此,我想添加一个关于参数名称与
System.Data.Odbc.OdbcCommand一起使用的小注意事项
,
据
用于ODBC的.NET Framework数据提供程序不支持传递
SQL语句或名为
通过odbc命令。在上述任一情况下,请使用问号(?)
占位符
下面是一个例子:
cmd.Parameters.AddWithValue(“@clientid”,clientid)
也可用。你真的应该使用block将SqlConnection
和SqlCommand
包装在中:嘿,当我发布这个问题时,我认为应该将数据作为参数而不是一个字符串传递。怪我的前老板,是他教我这样做的;)我现在将使用第一种方法,因为客户希望快速修复此问题,但会立即开始重构。您使用的是什么数据库?如果没有转义正确的字符集,查询仍然可以进行SQL注入。在执行之前,查询中不应该有cmd.Prepare()吗?如果没有,那么Prepare()有什么好处呢?
Dim command As OdbcCommand = connection.CreateCommand()
command.CommandText = “{ call MoneyProcedure(?,?,?) ”
command.Parameters.Add("", OdbcType.Int).Value = 1
command.Parameters.Add("", OdbcType.Decimal).Value = 2
command.Parameters.Add("", OdbcType.Decimal).Value = 3