防止在gridview中注入SQL

本文关键字:注入 SQL gridview | 更新日期: 2023-09-27 18:02:42

我想再检查一下,以确保正确防止注射。

我有一个旧的代码,在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;
}    

防止在gridview中注入SQL

我认为在你上面给出的例子的情况下,你绝对是安全的。对输入进行消毒总是一个最佳实践。

假设你有一个表单(某种类型的)上面有一个文本框,它没有限制可以输入的文本数量(这可能是潜在的非常坏)。

下面是一个例子:

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

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

这段代码看起来可以防止SQL注入攻击:

  • 您正在使用<asp:Parameter>标记为您的SQL查询。通过这种方式,它将不会成为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关键字。

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

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

您可以通过将sql代码放入存储过程并将变量传递给该存储过程来完成完全相同的事情。