我的代码运行良好但只有我直接使用用户输入。这使我的系统容易进行sql注入。
我在google上看到过一些使用vbn.et显示在预准备语句中使用参数绑定的示例。
不幸的是,这些例子不支持"提供商" ms访问表的连接字符串中的关键字。
理解这一点的人可以帮我修改下面的vb代码,使用Provider = Microsoft.Jet.OLEDB.4.0作为连接字符串来处理参数绑定吗?
我想避免说"密码=" &安培; supplier_password 但是说"其中密码= @supplier_password" 然后提供提供的密码文本。
这是我的vb网络代码。
Private Sub test_password()
Dim myConnection As OleDbConnection = New OleDbConnection
myConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =C:\books\author.mdb"
Dim counter As Int16
myConnection.Open()
Dim str As String
str = "SELECT * FROM users where password = '" & pass.Text & "'"
Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
counter = cmd.ExecuteScalar
myConnection.Close()
If counter > 0 Then
MsgBox("password was found")
Else
MsgBox("password was NOT found")
End If
End Sub
我使用了相应的
Imports System.Data.OleDb
Imports System.Data.SqlClient
非常感谢
答案 0 :(得分:4)
这是带有参数和正确使用一次性对象的代码版本
Private Sub test_password()
' Do not return all the fields, just count....'
' ...and password is a reserved keyword in access...'
' need square brackets around it otherwise ...syntax error...'
Dim str = "SELECT COUNT(*) FROM users where [password] = @pass"
Using myConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;....")
Using cmd = New OleDbCommand(str, myConnection)
myConnection.Open()
cmd.Parameters.Add("@pass", OleDbType.VarWChar).Value = pass.Text
' ExecuteScalar returns the first column of the first row from your query'
Dim counter = Convert.ToInt32(cmd.ExecuteScalar)
If counter > 0 Then
MsgBox("password was found")
Else
MsgBox("password was NOT found")
End If
End Using
End Using
End Sub
Using Statement确保完成使用后,每个一次性对象(此上下文中的连接和命令)都已正确处理。
插入参数占位符 @pass 代替实际值,并将参数添加到命令参数集合中,并使用字段期望的匹配数据类型和正确的值。
请注意,在OleDb中,参数占位符通常由问号?
表示,但Access也接受以@xxxx
格式表示的参数占位符。但是,参数集应按照与占位符在命令文本中出现的顺序相同的顺序添加参数。