使用int参数的SQL注入漏洞

时间:2013-11-25 08:52:03

标签: 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);
           }
        }
        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语句。

2 个答案:

答案 0 :(得分:4)

当然,直接格式化查询字符串不是一个好习惯。 SqlParameter class是出于您的目的而设计的 - 简化查询构建并完全防止SQL注入

答案 1 :(得分:4)

由于CatID是int,不,在这种情况下,您不容易受到SQL注入攻击。但是你选择的路径是滑坡,有一天,在重构或更改代码时,容易出现SQL注入。养成使用参数化查询并坚持使用它的习惯更好。

我可以完全建议你尝试Dapper(可以作为Nuget包使用(;这将大大简化事情,你不必为了它的好处而改变那么多。

您的代码将变成类似:

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