C# 使用int参数的SQL注入漏洞

C# 使用int参数的SQL注入漏洞,c#,asp.net,sql-server,sql-injection,C#,Asp.net,Sql Server,Sql Injection,大多数时候,我使用存储过程访问数据,但有时我使用我认为不易受SQL注入攻击的语句 下面是我使用的一个例子 protected void Page_Load(object sender, EventArgs e) { try { int CatID = Request["CatID"]; if (!IsPostBack) { getDetails(CatID)

大多数时候,我使用存储过程访问数据,但有时我使用我认为不易受SQL注入攻击的语句

下面是我使用的一个例子

protected void Page_Load(object sender, EventArgs e)
{
        try
        {
            int  CatID = Request["CatID"];

            if (!IsPostBack)
            {
                getDetails(CatID);
           }
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message.ToString());
        }
    }

    private DataTable getDetails( int CatID)
    {
        try
        {
            DataSet ds = new DataSet();

            string strSql = "SELECT * FROM TableXYZ WHERE CatID = "+CatID ;
            ds = DataProvider.Connect_Select(strSql);
            DataTable dt = ds.Tables[0];
            return dt;
        }
        catch (Exception ex)
        {
            throw;
        }
    }
我过滤输入或查询字符串,然后调用getDetails函数,并将CatID作为参数传递给函数,然后传递给SQL语句。因为这是一个整数类型的数据,所以这段代码容易受到SQL注入的攻击吗


我想澄清我的疑问,这样我就不会像这样使用SQL语句。

当然,直接格式化查询字符串不是一个好的做法。
类是专为您的目的而设计的—以简化查询构建并完全防止SQL注入。当然,直接格式化查询字符串不是一种好的做法。 类是专为您的目的而设计的-用于简化查询构建并完全防止SQL注入,因为CatID是int,不,在这种情况下,您不易受到SQL注入的攻击。但是,您选择的道路是一条不平坦的斜坡,有一天,在重构或更改代码时,很容易出现SQL注入。最好养成使用参数化查询并坚持使用的习惯

我可以诚恳地建议你试试Nuget套餐;这将大大简化事情,您不必为了它的好处做太多更改

然后,您的代码将变得像这样:

myConnection.Query<Customer>("SELECT * FROM TableXYZ WHERE CatID = @catid", new { catid = CatID });
因为CatID是一个int,不,在这种情况下,您不容易受到SQL注入的攻击。但是,您选择的道路是一条不平坦的斜坡,有一天,在重构或更改代码时,很容易出现SQL注入。最好养成使用参数化查询并坚持使用的习惯

我可以诚恳地建议你试试Nuget套餐;这将大大简化事情,您不必为了它的好处做太多更改

然后,您的代码将变得像这样:

myConnection.Query<Customer>("SELECT * FROM TableXYZ WHERE CatID = @catid", new { catid = CatID });


它不易被注入,但为了更方便的查询计划缓存,您无论如何都应该使用参数。对于将用户的内容直接附加到SQL,我会非常谨慎,除非您对其进行大量筛选。例如,在本例中,您可以先执行Int.TryParseCatID以确保它只是一个数字,这有助于你避免在他们陷入困境时撞车。即使如此,当您可以简单地使用SqlParameters时,为什么还要费心过滤它,还要担心这个问题?@ta.speot.is:普通SQL字符串也可以缓存它们的查询计划@托贝罗斯:为什么一个Int.ParseCatID?CatID已经被保证是!一个int see方法签名。@RobIII我说过他们不能吗?无论如何,为了更方便的查询计划缓存,您应该使用一个参数。@ta.speot.is抱歉,我的不好,读错了。它不易被注入,但为了更方便的查询计划缓存,您应该使用一个参数。对于将用户的内容直接附加到SQL,我总是非常谨慎,除非在本例中对其进行大量过滤,否则可以首先执行Int.TryParseCatID以确保它只是一个数字,这有助于避免在它们出错时崩溃。即使如此,当您可以简单地使用SqlParameters时,为什么还要费心过滤它,还要担心这个问题?@ta.speot.is:普通SQL字符串也可以缓存它们的查询计划@托贝罗斯:为什么一个Int.ParseCatID?CatID已经被保证是!一个int see方法签名。@RobIII我说过他们不能吗?无论如何,为了便于查询计划缓存,您应该使用一个参数。@ta.speot.is抱歉,我的不好,读错了。为了更好地执行计划,我更喜欢存储过程。。。我只是想知道上面的示例是否容易受到sql注入的攻击,因为考虑到输入是作为int CatID=Request[CatID]进行过滤的;我很感激你的建议,我将研究Dapper,但你可能仍然可以传递42或1=1之类的信息,然后基本上从TableXYZ返回所有行。。。将SQL连接在一起总是一个坏主意@marc_s:我想你是在回复KnowledgeSeeker,因为如果你指的是Dapper,那么它会被正确地参数化。另外,在最初的问题中,CatID的类型为int,因此您将无法通过42或1=1,但KnowledgeSeeker似乎在游戏开始后改变了游戏规则,在您上面的回答中,CatID仍然是int类型,所以再次。只要他不使用var或string,并确保在使用var时(例如,参数被解析为int),他就会安全。@knowledgeseek SQL Server不会生成更好的执行计划,因为您使用的是存储过程。这不像是一个存储过程。。。这次我最好做得好。我更喜欢存储过程以获得更好的执行计划。。。我只是想知道上面的示例是否容易受到sql注入的攻击,因为考虑到输入是作为int CatID=Request[CatID]进行过滤的;谢谢你的建议我会调查Dapper但你可以
可能仍然传递42或1=1之类的值,然后基本上从TableXYZ返回所有行。。。将SQL连接在一起总是一个坏主意@marc_s:我想你是在回复KnowledgeSeeker,因为如果你指的是Dapper,那么它会被正确地参数化。另外,在最初的问题中,CatID的类型为int,因此您将无法通过42或1=1,但KnowledgeSeeker似乎在游戏开始后改变了游戏规则,在您上面的回答中,CatID仍然是int类型,所以再次。只要他不使用var或string,并确保在使用var时(例如,参数被解析为int),他就会安全。@knowledgeseek SQL Server不会生成更好的执行计划,因为您使用的是存储过程。这不像是一个存储过程。。。这次我最好做好。