2011-05-18 108 views
2

对于我的登录控制,我在SQL语句中使用参数。麻烦的是,如果人们使用SQL注入,恐怕他们也能进入。解决SQL注入问题

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

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

谢谢你的时间!

回答

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) 
+0

不错的例子...注意他确实选择了VB.Net作为其中一个标签:-) – Xander 2011-05-18 10:45:46

+0

@Xander,谢谢,将在一秒钟内添加VB示例! – 2011-05-18 10:46:51

+0

的确很不错。无论你使用@Description还是?,它是否重要,因为我似乎只能使用? – CustomX 2011-05-18 10:49:59

0

是的,你应该使用SqlParameter。

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 
0

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

+0

不幸的是,我的托管网站已更新其数据库和存储程序目前不可用 - 。 - – CustomX 2011-05-18 10:50:59

0

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

+0

我知道,但我的提供程序不支持存储过程atm。 – CustomX 2011-05-18 10:53:10