我想仔细检查以确保这样可以正确防止进样。
我的旧代码在ASP .NET 3.5中使用了GridView(很久很久以前由其他人编写)。
在.aspx页面中(GridView使用此数据源):
<asp:SqlDataSource ID="sdsUserTables" runat="server"
ConnectionString="<%$ ConnectionStrings:Main %>"
DeleteCommand="DELETE FROM [MyTable] WHERE [tableID] = @tableID">
<DeleteParameters>
<asp:Parameter Name="tableid" Type="Int32" />
</DeleteParameters>
</asp:SqlDataSource>
这是否可以防止对tableId进行注入?
背后的代码有:
protected void sdsUserTables_Deleting(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["@tableId"].Value = myTableId;
}
答案 0 :(得分:1)
是的,你正在使用一个变量并声明它的类型,这两个因素将阻止SQL注入攻击。
请参阅... http://www.mikesdotnetting.com/Article/113/Preventing-SQL-Injection-in-ASP.NET
你可以通过将sql代码放入存储过程并将变量传递给它来完成同样的事情。
答案 1 :(得分:1)
这段代码对我来说可以防止SQL注入攻击:
您正在为SQL查询使用<asp:Parameter>
标记。通过这种方式,它不会成为SQL命令的一部分,并将作为参数发送到SQL服务器:这是正确的方式,无论其类型如何。
SQL命令和<asp:SqlDataSource>
标记中的连接字符串将嵌入到程序集中:它不可供用户使用,也不会在页面中显示。所以它不能被篡改。
如果您想要强制执行针对SQL注入的保护:
确保您网页的[validateRequest][1]
参数设置为“true”:
// This parameter is normally set to "true" by default in the machine.config file
<pages validateRequest="true" />
例如:
// assuming myTableId is a string
try
{
int i = int.Parse(myTableId)
e.Command.Parameters["@tableId"].Value = i;
}
catch
{
throw new ApplicationException("Table Id should be an integer");
}
如果您的用户输入是字符串,则在使用参数时无需检查每个SQL关键字。
答案 2 :(得分:1)
我认为就你上面给出的例子而言,你绝对安全。清理您的输入始终是最佳做法。
假设您有一个带有文本框的表单(某种类型),那么对其中可以输入的文本数量没有限制(这可能是非常糟糕)。
以下是一个例子:
sqlParameter sqlParam = new SqlParameter();
sqlParam.ParameterName = "@testParam";
sqlCommand.Parameters.AddWithValue("@testParam", textBox1.Text);
在上面的示例中,再次假设您的文本框未绑定,您将潜在的恶意字符串填充到参数中的事实可以防止原始数据对您的表格产生不良影响( S)/(多个)数据库。