C# 防止gridview中的SQL注入

C# 防止gridview中的SQL注入,c#,asp.net,.net,sql-injection,C#,Asp.net,.net,Sql Injection,我想再次检查,以确保这是防止注射正确 我有一段在ASP.NET3.5中使用GridView(很久很久以前由其他人编写)的旧代码 在.aspx页面中(GridView使用此数据源): 是的,您使用的是一个变量,并且声明了它的类型,这两个因素将阻止SQL注入攻击 看。。。 您可以通过将sql代码转换为存储过程并向其中传递变量来执行完全相同的操作。我认为这段代码可以防止sql注入攻击: 您正在使用标记进行SQL查询。通过这种方式,它将不是SQL命令的一部分,并将作为参数发送到SQL server:

我想再次检查,以确保这是防止注射正确

我有一段在ASP.NET3.5中使用GridView(很久很久以前由其他人编写)的旧代码

在.aspx页面中(GridView使用此数据源):


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

看。。。


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

我认为这段代码可以防止sql注入攻击:

  • 您正在使用
    标记进行SQL查询。通过这种方式,它将不是SQL命令的一部分,并将作为参数发送到SQL server:这是正确的方式,无论其类型如何

  • 标记中的SQL命令和连接字符串将嵌入到程序集:用户将无法使用该命令,也无法在页面中看到它。所以它不能被篡改

如果您希望强制执行针对SQL注入的保护,通常:

确保页面的
[validateRequest][1]
参数设置为“true”:


如果您的用户输入是字符串,那么如果您使用参数,则无需检查每个SQL关键字。

我认为在您上面给出的示例中,您肯定是安全的。对输入进行消毒始终是最佳做法

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

以下是一个例子:

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

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

鉴于
tableID
是作为参数传递的,我怀疑您是安全的。不过,我很想知道,
tableID
是如何设置的/在哪里设置的?它是一个文本框?下拉列表?代码隐藏中的变量集…?它在代码隐藏中的集。如果我有一个参数,比如:?请在引用的后面发布代码,
tableID
。它已经更新了。我在我的机器上测试说,如果我为搜索值之类的东西切换id并将其作为字符串传递,它不会删除我的表,这很好。如果用户键入的字符串之类的参数出现在哪里呢?我可能用词不正确,重要的是Type=“”,如指定它是什么类型的参数。
protected void sdsUserTables_Deleting(object sender, SqlDataSourceCommandEventArgs e)
{
    e.Command.Parameters["@tableId"].Value = myTableId;
}    
// 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");
}
sqlParameter sqlParam = new SqlParameter();
sqlParam.ParameterName = "@testParam";
sqlCommand.Parameters.AddWithValue("@testParam", textBox1.Text);