在我的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>
答案 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。