【问题标题】:.net viewstate safe from SQL injection?.net 视图状态不受 SQL 注入影响?
【发布时间】:2011-07-19 00:19:38
【问题描述】:

我正在使用命令名和命令参数来控制排序(字段和方向)。 SQL 注入的视图状态有多安全。

【问题讨论】:

  • 能否请您发布您的SQL语句代码?
  • 如果您将这些命令名称或参数发送给客户端,只需在数据作为 SQL 执行之前对其进行清理,就可以了(当然,如果仅此而已)

标签: asp.net sql-injection viewstate


【解决方案1】:

SQL injection 将用户输入的值直接放入查询中,从而允许恶意用户利用您的安全漏洞访问或破坏您的数据库。例如,您有一个要搜索的文本框,他们输入的值进入实际查询中。

除非您的命令参数是由用户动态输入的,否则 SQL 注入不会构成威胁。

【讨论】:

    【解决方案2】:

    如果您使用的是原始 SQL,那么您可能会使用 DataTable 对象,对吧?如果您使用的是 DataTable,那么您可以在使用 DataView 从数据库中提取数据后对该数据进行排序,并将您的控件绑定到 DataView。这样,您就不会授予用户提交的数据访问您的 SQL 的权限。所以,在你的代码中你会做这样的事情:

    DataTable dt = GetData(); // pull data from DB with no sort specified
    DataView view = dt.DefaultView;  // Get a DataView so you can sort
    view.Sort = "Col1, Col2 DESC"; // assemble sort string from your command args
    MyControl.DataSource = view;
    MyControl.DataBind();
    

    【讨论】:

      【解决方案3】:

      如果您将值从 ViewState 传递到连接的 SQL,那么可以。但是,如果您使用的是 Bind Parameters(您是,不是吗?),那么您不必担心。

      不好:

      string sql = "select * from product where name = ' + ProductNameTextBox.Text + '"
      

      好:

      string sql = "select * from product where name = @name"
      
      using(var command = new SqlCommand(sql, connection))
      {
      
         SqlParameter param = new SqlServerParameter("@name", SqlDbType.VarChar, 50);
         param.Value = ProductNameTextBox.Text;
      
         command.Parameters.Add(param);
      
         command.ExecuteNonQuery();
      }
      

      【讨论】:

        【解决方案4】:

        这取决于“直接放入 SQL 查询”是否意味着它们是参数化查询的参数或作为文字......如果作为文字,那么答案是否定的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-16
          • 1970-01-01
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多