解决SQL注入问题

时间:2011-05-18 10:42:13

标签: asp.net mysql vb.net login sql-injection

对于我的登录控件,我在SQL语句中使用参数。麻烦的是,如果人们使用SQLinjection,我担心它们也能够进入。

我有两个文本框,值传递给SQL语句,这会检查是否在数据库中找到这些值。

有没有办法确保这是不可能的?我知道在PHP中你需要使用文本框前面的东西。

谢谢你的时间!

5 个答案:

答案 0 :(得分:7)

在查询中使用参数:

// C#
SqlCommand cmd = new SqlCommand("UPDATE Products SET description = @Description WHERE id = @ID");
cmd.Parameters.AddWithValue("@Description", "something");
cmd.Parameters.AddWithValue("@ID", 123);

和VB.net中的等价物:

// VB.net
Dim cmd As New SqlCommand("UPDATE Products SET description = @Description WHERE id = @ID")
cmd.Parameters.AddWithValue("@Description", "something")
cmd.Parameters.AddWithValue("@ID", 123)

答案 1 :(得分:0)

是的,你应该使用SqlParameter。

答案 2 :(得分:0)

建议使用参数化查询

见下面的例子

Private Sub DisplayPersonData(ByVal first_name As String, _
    ByVal last_name As String)
    ' Open the connection.
    connUsers.Open()

    ' Make a Command for this connection
    ' and this transaction.
    Dim cmd As New OleDb.OleDbCommand( _
        "SELECT * FROM People WHERE FirstName=? AND " & _
            "LastName=?", _
        connUsers)

    ' Create parameters for the query.
    cmd.Parameters.Add(New _
        OleDb.OleDbParameter("FirstName", first_name))
    cmd.Parameters.Add(New OleDb.OleDbParameter("LastName", _
        last_name))

    ' Execute the query.
    Dim db_reader As OleDbDataReader = _
        cmd.ExecuteReader(CommandBehavior.SingleRow)

    ' Display the results.
    If db_reader.HasRows Then
        db_reader.Read()
        txtFirstName.Text = _
            db_reader.Item("FirstName").ToString
        txtLastName.Text = _
            db_reader.Item("LastName").ToString
        txtStreet.Text = db_reader.Item("Street").ToString
        txtCity.Text = db_reader.Item("City").ToString
        txtState.Text = db_reader.Item("State").ToString
        txtZip.Text = db_reader.Item("Zip").ToString
    Else
        For Each ctl As Control In Me.Controls
            If TypeOf ctl Is TextBox Then ctl.Text = ""
        Next ctl
    End If

    ' Close the connection.
    connUsers.Close()
End Sub

答案 3 :(得分:0)

使用存储过程和数据库抽象层(ORM)

答案 4 :(得分:0)

如果您具有相应的服务器端权限,则可以创建存储过程来接受参数,而不是将更新语句分配给命令对象。 SP还提供比动态DML语句更好的性能。