TableAdapter / DataSet是否可以安全地从SQL注入?

时间:2011-10-11 06:05:19

标签: asp.net sql code-injection

在我的ASP.NET(3.5)项目中,我使用内置的TableAdapters / Dataset进行所有数据访问。它是否提供与SQL注入SQLDataSource相同的安全性?我使用的参数如下。

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

中存在的以下查询

从sometable中选择某些东西,其中fieldname = @parameter

更新2: 如果我'查看XSD的代码',我可以看到以下

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

1 个答案:

答案 0 :(得分:0)

取决于。

如果你严重使用tableAdapters,你可以获得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请求的内容)被传递到数据库参数内的数据库,如@au_id。在这种情况下,您可以免受SQL注入。

BAD WAY就是这样(不要使用它):

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

这样用户可以操作发送给DB的内容,如果与DB的连接具有足够的权限,则可以删除表或数据库。或者它可以默默地修改您的数据,这甚至更糟。

因此,始终使用数据库参数。

此外,如果你获得了性能,因为DB将缓存执行计划,如果稍后执行相同的SQL只有不同的参数值,DB已经有执行计划,它不需要再次解析sql。