参数化查询以防止SQL注入

时间:2013-09-18 15:12:15

标签: sql sql-server vb.net parameters

我知道我需要参数化我的查询,主要是出于安全原因,我需要帮助。我在Visual Studio 2012和SQL Server 2012中使用VB。我以前从未这样做过,我在网上找到的所有内容似乎都不适合我的特定代码。我认为需要工作的一点如下:

objconnection.Open()

    strSQL = "insert into dbo.Event(ID, Name, Summary, Date) values (NEWID(), '" & strName & "','" & strSummary & "','" & strLocation & "','" & strDate & "')"
    objcmd = New OleDbCommand(strSQL, objconnection)
    objcmd.ExecuteNonQuery()
    objconnection.Close()
    MsgBox("Event Created", vbMsgBoxSetForeground)

任何指针都非常感激。如果您需要更多代码,请告诉我们!

来自评论:

我确实看过那个并试过但我遇到了问题。在这一部分:

.add(new SqlParameter("@strname", '"& strName &"'))
“@streventname”和“strName”之间的下划线标有Expression expected.

另外

Dim cmd As SqlCommand = New SqlCommand(cmdText, objconnection)
  

objconnection收到错误“类型'System.Data.OleDb.OleDbConnection'的值无法转换为'System.Data.SqlClient.SqlConnection'。

可能是我错过了一些蠢事。

3 个答案:

答案 0 :(得分:5)

您正在将SQL对象与OLEDB对象混合使用。看起来你正在使用OLEDB连接,这意味着你必须使用OLEDB-Objects,所以使用OleDbCommand而不是SqlCommand等。

您的参数行应如下所示:

.add(new OleDbParameter("@strname", strName))

对于OleDB查询,重要的是要意识到参数实际上忽略了名称@strname,只是按索引顺序更新参数信息。因此,参数在sql语句中出现的顺序必须与提供参数的顺序相同。

答案 1 :(得分:1)

感谢您的帮助。我设法解决了它。如果有人有兴趣,这就是我现在所拥有的。

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strName As String = Request.Form("txtName")
        Dim strSummary As String = Request.Form("txtSummary")
        Dim strDate As String = Request.Form("txtDate")

        Dim objconnection As OleDbConnection = Nothing
        Dim objcmd As OleDbCommand = Nothing
        Dim strconnection As String, strSQL As String

        strconnection = "provider=SQLOLEDB;data source=XXX;database=Events;uid=XXX;pwd=XXX;"

        objconnection = New OleDbConnection(strconnection)
        objconnection.ConnectionString = strconnection

        objconnection.Open()

        strSQL = "insert into dbo.CreateApp(ID, Name, Summary, Date)values(NEWID(), ?, ?, ?)"
        objcmd = New OleDbCommand(strSQL, objconnection)
        objcmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("@Name", strName))
        objcmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("@Summary", strSummary))   
        objcmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("@Date", strDate))
        objcmd.ExecuteNonQuery()

        objconnection.Close()

    End Sub
End Class

关键是放入?s。

答案 2 :(得分:0)

我同意Lars,除非你错过了sql错误的事实。这是一个更完整的例子。

    Dim sql = <value>insert into dbo.Event(ID, Name, Summary, Date) values (NEWID(),@Name,@Summary,@Date)</value>

    Using connection As OleDb.OleDbConnection(connectionString)
        Using command As New OleDb.OleDbCommand(sql.Value, connection)
            command.Parameters.AddWithValue("@Name", nameValue)
            command.Parameters.AddWithValue("@Summary", summaryValue)
            command.Parameters.AddWithValue("@Date", DateValue)

            command.ExecuteNonQuery()
        End Using
    End Using 

如果您不想使用ADO并且正在寻找更简单的东西,我建议使用Simple.Data http://simplefx.org/simpledata/docs/。到目前为止,这是与数据库交互的最简单方法之一,而不必现在使用SQL或ADO,但它确实有帮助。

祝你好运