Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB.net中转义字符串(添加斜杠)?_Vb.net_String_Escaping - Fatal编程技术网

在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 + "'" 如果我在消息中使用撇号,那么这当然会使查

非常简单的问题(令人惊讶的是,我在任何地方都找不到类似的问题):如何在VB.net中转义表单数据?我有很多这样的句子:

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