0

再次按照问题:我们是否真的需要将数字数据类型变量值作为参数传递以防止 sql 注入。

我确实有两个示例函数,一个带参数,下一个不使用参数

function CheckThis(int UIN)
{
  var connect = ConfigurationManager.ConnectionStrings["NorthWind"].ToString();
  var query = "Select * From Products Where ProductID = @ProductID";
  using (var conn = new SqlConnection(connect))
  {
    using (var cmd = new SqlCommand(query, conn))
    {
      cmd.Parameters.Add("@ProductID", SqlDbType.Int);
      cmd.Parameters["@ProductID"].Value = UIN;
      conn.Open();
      //Process results
    }
  }
}

或遵循正常

function CheckThis(int UIN)
{
  var connect = ConfigurationManager.ConnectionStrings["NorthWind"].ToString();
  var query = "Select * From Products Where ProductID = " + UIN;
  using (var conn = new SqlConnection(connect))
  {
    using (var cmd = new SqlCommand(query, conn))
    {
      //cmd.Parameters.Add("@ProductID", SqlDbType.Int);
      //cmd.Parameters["@ProductID"].Value = UIN;
      conn.Open();
      //Process results
    }
  }
}
4

1 回答 1

3

您不需要这样做来阻止 SQL 注入攻击1。然而:

  • 如果将 SQL 与值分开,您的代码会更清晰
  • 如果稍后将类型更改为其他类型,那么int您将面临注入攻击的风险,并且完全有可能在代码审查中被遗漏
  • 它避免了涉及意外千位分隔符等的数字到字符串转换的任何问题

简而言之,我肯定还是会使用参数。


1除非您的攻击者也可以影响您的区域设置。那时,即使是字符串与整数的连接也容易受到 SQL 注入攻击

于 2013-07-18T09:54:44.007 回答