我的代码中有这个sql漏洞吗?

时间:2013-07-07 01:30:09

标签: asp.net

我的代码中有这个sql漏洞吗?因为我已经参数化了SQL,所以没有sql注入?任何人都会给予一些建议会欣赏!如果是的话,如何修复?

ASP.NET代码:

   public DataTable CompanySearchUser(int pageSize, int currentPage, string whereCondition)
        {
            DbParameter[] parms = {
                                       DbHelper.MakeInParam("@PageSize",(DbType)SqlDbType.Int,4,pageSize),
                                       DbHelper.MakeInParam("@PageNumber",(DbType)SqlDbType.Int,4,currentPage),
                                       DbHelper.MakeInParam("@where",(DbType)SqlDbType.NVarChar,500,whereCondition)
                                   };
            DataTable userlist = DbHelper.ExecuteDataset(CommandType.StoredProcedure, "spCompanySearchUser", parms).Tables[0];

            return userlist;

        }

SQL CODE:

ALTER PROC [dbo].[spCompanySearchUser]
                                      @PageSize   INT
                                      @PageNumber INT,
                                      @where nvarchar(550)--like 'and a=1 '

AS
  DECLARE @RowStart INT
  DECLARE @RowEnd INT
  DECLARE @SQL NVARCHAR(4000)
  IF @PageNumber > 0
    BEGIN
        SET @PageNumber = @PageNumber - 1
        SET @RowStart = @PageSize * @PageNumber + 1;
        SET @RowEnd = @RowStart + @PageSize - 1;
        SET @SQL='
        WITH AllUsers
             AS (SELECT 
       UB.UserBaicInfoID,
       UB.UserName,
       UB.HighestEducation,
       UB.Age,
       UB.Sex,
       UB.WorkExperience,
       UB.PositionDesired,
       UB.UpdateTime,
                        Row_number() OVER (ORDER BY UB.UpdateTime DESC) AS RowNumber             
       From  UserBasicInfo UB
         WHERE ResumeState=1 '+@where+')

   SELECT * FROM  AllUsers WHERE  RowNumber >=' + Str(@RowStart) + '  AND RowNumber <= ' + Str(@RowEnd) + ''
        EXEC sp_executesql @SQL
    END 

我的代码中有这个sql漏洞吗?因为我已经参数化了SQL,所以没有sql注入?任何人都会给予一些建议会欣赏!如果是的话,如何修复?

2 个答案:

答案 0 :(得分:0)

目前无法测试,但我会说是的。

你传入@where并进行连接,你的@where正在执行实际的sql代码而不是真正的“where”子句

然后你对最终的sql代码执行exec

这可以被利用

不确定你的whereCondition是什么样的,但试试这个

    public DataTable CompanySearchUser(int pageSize, int currentPage, string whereCondition)
    {

        /**** add this  to test ****/

        whereCondition += " or 1=1";

        /**** add this  to test ****/


        DbParameter[] parms = {
                                   DbHelper.MakeInParam("@PageSize",(DbType)SqlDbType.Int,4,pageSize),
                                   DbHelper.MakeInParam("@PageNumber",(DbType)SqlDbType.Int,4,currentPage),
                                   DbHelper.MakeInParam("@where",(DbType)SqlDbType.NVarChar,500,whereCondition)
                               };
        DataTable userlist = DbHelper.ExecuteDataset(CommandType.StoredProcedure, "spCompanySearchUser", parms).Tables[0];

        return userlist;

    }

答案 1 :(得分:0)

它仍然不安全且不具备性能。

您应该动态地执行SQ​​L并在那里添加参数,而不是依赖于sp_executeSQL。

使用@占位符项cmd.Parameters.AddWithValue("@placeholder", value)值构建字符串,然后添加这些参数,通常会更好,更安全,更易于管理,并且不会浪费SQL的时间,因为它不会能够优化你的陈述。

实际上,在代码中动态地执行它可以获得更好的性能,而不是在存储过程中,因为SQL将缓存每个语句并在相同的语句出现时重新执行它们。

相关问题