2011-10-11 78 views
0

在我的ASP.NET(3.5)項目中,我爲所有數據訪問使用內置的TableAdapters/Dataset。它是否提供與SQLDataSource從SQL注入相同的安全性?我使用的參數如下。TableAdapter/DataSet安全嗎?

Dim myDAL As New ABCTableAdapters.XYZTableAdapter 
Label1.Text = myDAL.getDatafromDB(myParameter) 

更新1:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
      Dim myParameter As String = getSafeURL(Request.QueryString("MS_Code")) 'getsafeurl encodes querystring using HttpUtility.UrlEncode 
      Dim myDAL As New ABCTableAdapters.XYZTableAdapter 
      Label1.Text = myDAL.getDatafromDB(myParameter) 
    End Sub 

getDatafromDB對應於下面的查詢存在於的app_code/DAL.xsd

SELECT東西FROM sometable其中字段名= @parameter

更新2: 如果我查看XS的代碼D我可以看到以下

<SelectCommand> 
       <DbCommand CommandType="Text" ModifiedByUser="true"> 
       <CommandText>SELECT pageContent FROM [content] where name = @name</CommandText> 
       <Parameters> 
        <Parameter AllowDbNull="true" AutogeneratedName="name" ColumnName="name" DataSourceName="iseac.dbo.[content]" DataTypeServer="nchar(100)" DbType="String" Direction="Input" ParameterName="@name" Precision="0" ProviderType="NChar" Scale="0" Size="100" SourceColumn="name" SourceColumnNullMapping="false" SourceVersion="Current" /> 
       </Parameters> 
       </DbCommand> 
      </SelectCommand> 
+0

你能說明'getDatafromDB'方法是怎麼樣的嗎? –

+0

@Darin Dimitrov - 請參考更新 –

回答

0

這要看。

如果你使用tableAdapter,你可能會得到SQL注入。

最主要的是對從用戶收集的所有數據使用SqlParameters。

你能展示一些你的數據訪問代碼嗎?

查一查這裏How To: Protect From SQL Injection in ASP.NET

using System.Data; 
using System.Data.SqlClient; 

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    DataSet userDataset = new DataSet(); 
    SqlDataAdapter myDataAdapter = new SqlDataAdapter(
    "SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", 
    connection);     
    myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11); 
    myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text; 
    myDataAdapter.Fill(userDataset); 
} 

這裏最重要的是,用戶輸入的數據(從什麼Web請求中來)傳遞給DB數據庫裏面的參數,如@au_id。在這種情況下,您將受到SQL注入的保護。

糟糕的方式會是這樣(不要用這個):

myCommandText = string.Format(
    "SELECT au_lname, au_fname 
    FROM Authors WHERE au_id = {0}", SSN.Text) 

這樣,用戶可以操作的是發送到數據庫,如果你對數據庫連接有足夠的權限,它可以刪除表或數據庫。或者它可以默默修改你的數據,而且更糟。

因此,請始終使用數據庫參數。

此外,如果您在性能上獲益,因爲數據庫將緩存執行計劃,並且如果以後執行的參數只有不同值的同一個SQL,則DB已經有執行計劃,並且不需要再次解析sql。

+0

請參考更新 –

+0

你有附近的地方像 新的SqlParameter(「@參數」,SlqType.Varchar)? –

+0

請參閱更新2.使用鍵入的參數不一樣。我唯一擔心的是它是否具有與ADO.NET參數化查詢相同的安全性,以避免SQLi –