防止 ASP.Net 中的 SQL 注入
我有這個程式碼
UPDATE OPENQUERY (db,'SELECT * FROM table WHERE ref = ''"+ Ref +"'' AND bookno = ''"+ Session("number") +"'' ')我將如何防止對此進行 SQL 注入?
更新
這就是我正在嘗試的
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我需要指定一個特定的命名空間才能工作嗎?更新
有沒有人有任何想法讓我的查詢免受 SQL 注入的影響,而不會出現我遇到的錯誤?
更新
我現在有了它,所以它可以在沒有參數的情況下工作,這是我更新的原始碼,知道為什麼它不會添加參數值嗎?
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有任何想法嗎?
解決方案
這是我解決問題的方法
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 注入了
在這裡嘗試使用參數化查詢 是一個連結http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/
另外,不要使用 OpenQuery… 使用 this 執行選擇
SELECT * FROM db...table WHERE ref = @ref AND bookno = @bookno更多描述您的一些選項的文章:
http://support.microsoft.com/kb/314520
連接到另一個 SQL Server 的 T-SQL 語法是什麼?
已編輯
注意:您最初的問題是詢問分佈式查詢和連結伺服器。此新語句不引用分佈式查詢。我只能假設您現在直接連接到數據庫。這是一個應該工作的例子。這是另一個使用SqlCommand.Parameters的參考站點
SqlCommand cmd = new SqlCommand("Select * from Table where ref=@ref", con); cmd.Parameters.Add("@ref", SqlDbType.Int); cmd.Parameters["@ref"] = 34;編輯:
好的 Jamie taylor 我會再次嘗試回答你的問題。
您正在使用 OpenQuery,因為您可能正在使用連結數據庫
基本上問題是 OpenQuery 方法需要一個字元串,您不能將變數作為您發送到 OpenQuery 的字元串的一部分傳遞。
您可以像這樣格式化您的查詢。符號遵循 servername.databasename.schemaname.tablename。如果您通過 odbc 使用連結伺服器,則省略 databasename 和 schemaname,如下圖所示
Dim conn As SqlConnection = New SqlConnection("your SQL Connection String") Dim cmd As SqlCommand = conn.CreateCommand() cmd.CommandText = "Select * db...table where investor = @investor" Dim parameter As SqlParameter = cmd.CreateParameter() parameter.DbType = SqlDbType.Int parameter.ParameterName = "@investor" parameter.Direction = ParameterDirection.Input parameter.Value = 34