0

我的代码中有这个 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 代码:

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 注入?任何人提出一些建议将不胜感激!如果是,如何修复?

4

2 回答 2

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;

    }
于 2013-07-07T01:35:47.210 回答
0

它仍然不安全且性能不佳。

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

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

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

于 2013-07-07T01:38:41.593 回答