Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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 防止SQL注入攻击_Vb.net_Tsql_Oledb_Executescalar - Fatal编程技术网

Vb.net 防止SQL注入攻击

Vb.net 防止SQL注入攻击,vb.net,tsql,oledb,executescalar,Vb.net,Tsql,Oledb,Executescalar,我有一个包含SQL查询的程序,昨天有人向我指出,它非常容易受到SQL注入攻击。在做了一些研究之后,我发现要解决这个问题,我需要使用参数。 我有以下代码。。。你怎么把这个参数化 Public Shared Function SaveNewPerson(ByVal firstName As String, lastName As String, ByVal age As Integer, ByVal postcode As String, m_cn As OleDbConnection)

我有一个包含SQL查询的程序,昨天有人向我指出,它非常容易受到SQL注入攻击。在做了一些研究之后,我发现要解决这个问题,我需要使用参数。 我有以下代码。。。你怎么把这个参数化

Public Shared Function SaveNewPerson(ByVal firstName As String, lastName As String, ByVal age As Integer, ByVal postcode As String, m_cn As OleDbConnection)

    Dim tr As OleDbTransaction = Nothing

    Try
        tr = m_cn.BeginTransaction()

        Dim Dc As New OleDbCommand
        Dc.Connection = m_cn

        Dc.CommandText = "INSERT INTO tblPerson([firstName], [lastName], [age], [postcode]) VALUES('" & firstName & "', '" & lastName & "', '" & age & "', '" & postcode & "')"
        Dc.Transaction = tr
        Dc.ExecuteNonQuery()

        Dim personID As Integer

        Dc.CommandText = "SELECT SCOPE_IDENTITY() AS personID"
        Dc.CommandType = CommandType.Text
        personID = CType(Dc.ExecuteScalar(), Integer)

        tr.Commit()

    Catch ex As Exception

        tr.Rollback()

        Throw
    End Try

End Function
将此更改为

Dc.CommandText = "INSERT INTO tblPerson([firstName], [lastName], [age], [postcode]) VALUES(?, ?, ?, ?)"
Dc.Parameters.Add("@first", OleDbType.VarChar, firstName)
Dc.Parameters.Add("@last", OleDbType.VarChar, lastName)
Dc.Parameters.Add("@age", OleDbType.Integer, age)
Dc.Parameters.Add("@postcode", OleDbType.VarChar, postcode )
(检查是否传递了右侧的
OldDbType
值。)


注意。参数集合中的顺序决定了哪个参数与哪个
占位符匹配。为参数指定的名称(似乎)被忽略。

我会先创建一个存储过程,插入到sql server中,然后使用

    dc.commandText = "Your stored procedure name"
    dc.commandType = CommandType.StoredProcedure
    Dim myParam as oledb.OleDbParameter = dc.parameters.add("@personID", oledbtype.int)
    myParam.Direction = ParameterDirection.ReturnValue
    dc.Parameters.Add("@firstName", OleDbType.VarChar).Value = [firstname]
    ....
    ....

    Dim returnId as Integer = Cint(dc.Parameters("@personID").Value)   

我相信您必须为OLEDB查询参数使用
占位符?@MattWilko使用此代码直接从Richards answer复制和粘贴。我输入的数据是firstName作为Test,lastName作为User,年龄30岁,邮政编码为ABC 123。我当前在
Dc.Parameters.行中得到一个错误。添加(“@first”,OleDbType.VarChar,firstName)
表示从字符串“Test”转换为类型“Integer”无效。这就是原因吗,需要使用问号吗?@joe您可能是对的,已更新为使用正确的参数占位符。@Richard Hi,很抱歉这仍然不起作用:(我创建了一个新问题,其中我有一个工作语句,但最后有一个错误,如果你能帮助解决这个问题?@Joe:这个新问题已经得到了回答。也许你只需要一个问题,但要确保它是完整的代码(例如,这个问题中没有要转换的“测试”值)。可能重复@MattWilko Hi Matt,我使用的是SQLServer,而不是Access数据库,我可能应该在问题中明确这一点,但这就是为什么我说OleDb是一个奇怪的选择。请发布您的表架构/定义。另外,您使用的是什么db服务器?@fcm没有定义,我在SQLServer中创建了它g vb项目只需用变量替换字符串常量,但我需要SQL语句将数据插入数据库,然后为每个记录创建一个ID,而不是保存它,然后在单独的函数中返回ID。我认为下面的答案可能更好,因为它可以在我得到的一个错误之外工作。@joe这将在插入记录后获取id。您可以在存储过程中将'@id'声明为INT SET'@id'=SCOPE_IDENTITY()返回'@id.'
    dc.commandText = "Your stored procedure name"
    dc.commandType = CommandType.StoredProcedure
    Dim myParam as oledb.OleDbParameter = dc.parameters.add("@personID", oledbtype.int)
    myParam.Direction = ParameterDirection.ReturnValue
    dc.Parameters.Add("@firstName", OleDbType.VarChar).Value = [firstname]
    ....
    ....

    Dim returnId as Integer = Cint(dc.Parameters("@personID").Value)