2011-10-11 51 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 –