1

我想仔细检查以确保这可以正确防止注射。

我有在 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;
}    
4

3 回答 3

1

我认为在您上面给出的示例中,您绝对是安全的。清理输入始终是最佳实践。

假设您有一个带有文本框的表单(某种类型),它对可以输入的文本数量没有限制(这可能非常糟糕)。

这是一个例子:

sqlParameter sqlParam = new SqlParameter();
sqlParam.ParameterName = "@testParam";
sqlCommand.Parameters.AddWithValue("@testParam", textBox1.Text);

在上面的示例中,再次假设您的文本框未绑定,您将潜在的恶意字符串填充到参数中的事实可以防止原始数据对您的表/数据库产生不良影响。

于 2013-03-06T20:34:06.543 回答
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 关键字。

于 2013-03-06T20:25:43.393 回答
1

是的,您正在使用一个变量并且它的类型已声明,这两个因素将防止 SQL 注入攻击。

见... http://www.mikesdotnetting.com/Article/113/Preventing-SQL-Injection-in-ASP.NET

您可以通过将您的 sql 代码转换为存储过程并将变量传递给该过程来执行完全相同的操作。

于 2013-03-06T19:54:07.450 回答