Asp.net

防止 ASP.Net 中的 SQL 注入

  • June 20, 2015

我有這個程式碼

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'. 

這是因為它沒有@investor69836

有任何想法嗎?

解決方案

這是我解決問題的方法

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

引用自:https://stackoverflow.com/questions/4018174