我有这个代码
UPDATE OPENQUERY (db,'SELECT * FROM table WHERE ref = ''"+ Ref +"'' AND bookno = ''"+ Session("number") +"'' ')
我该如何防止 SQL 注入呢?
UPDATE
这就是我正在尝试的
SqlCommand cmd = new SqlCommand("Select * from Table where ref=@ref", con);
cmd.Parameters.AddWithValue("@ref", 34);
由于某种原因,我尝试添加的所有内容似乎都不起作用,我不断收到SQL Command
如以下所说的。
错误是这样的
'SqlCommand' is a type and cannot be used as an expression
我正在接管别人的工作,所以这对我来说是全新的,我希望以正确的方式做事,所以如果有人可以提供更多关于如何使我的查询免受 SQL 注入攻击的帮助,那么请这样做。
更新2号
我在代码中添加了 VasilP 所说的这样
Dim dbQuery As [String] = "SELECT * FROM table WHERE ref = '" & Tools.SQLSafeString(Ref) & "' AND bookno = '" & Tools.SQLSafeString(Session("number")) & "'"
但我收到一个错误Tools is not declared
我是否需要指定某个名称空间才能使其工作?
UPDATE
有没有人知道如何最好地让我的查询免受 SQL 注入的影响,而又不会出现我遇到的错误?
UPDATE
我现在有了它,所以它可以在没有参数的情况下工作,这是我更新的源代码,知道为什么它不会添加参数值吗?
Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = @investor ') ", conn)
query.Parameters.AddWithValue("@investor", 69836)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
它的工作原理是这样的
Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = 69836') ", conn)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
我收到的错误是这样的
An error occurred while preparing a query for execution against OLE DB provider 'MSDASQL'.
这是因为它并没有取代@investor
与69836
有任何想法吗?
SOLUTION
这是我解决问题的方法
Dim conn As SqlConnection = New SqlConnection("server='h'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("DECLARE @investor varchar(10), @sql varchar(1000) Select @investor = 69836 select @sql = 'SELECT * FROM OPENQUERY(db,''SELECT * FROM table WHERE investor = ''''' + @investor + ''''''')' EXEC(@sql)", conn)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
现在我可以编写查询而不必担心 SQL 注入