对于我的登录控件,我在SQL语句中使用参数。麻烦的是,如果人们使用SQLinjection,我担心它们也能够进入。
我有两个文本框,值传递给SQL语句,这会检查是否在数据库中找到这些值。
有没有办法确保这是不可能的?我知道在PHP中你需要使用文本框前面的东西。
谢谢你的时间!
答案 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语句更好的性能。