2013-07-07 62 views
0

這是我的代碼中的sql漏洞嗎?因爲我有參數化的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 '[email protected]+') 

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

是在我的代碼此漏洞的SQL因爲我在參數化SQL,所以沒有SQL注入?任何人給一些建議將會感激!如果是的話,如何修復?

+1

不會傳遞整個'where'條件(甚至是逐字的一部分)。從傳遞的參數中自行構造表達式。檢查參數並在將它們粘貼到查詢之前確保它們具有預期的類型。 – akonsu

回答

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; 

    } 
0

它仍然是不安全和不高性能的。

您應該動態地執行SQ​​L並在其中添加參數,而不是依賴於sp_executeSQL。

構建字符串與@佔位符項目cmd.Parameters.AddWithValue("@placeholder", value)值,然後添加這些參數,一般會更好,更安全,更易於管理,而且不會浪費SQL的時間,因爲它不能夠優化您的語句。

實際上,您可能會在代碼中動態執行它,而不是在存儲過程中執行它,因爲如果出現相同的語句,SQL將緩存每個語句並重新執行它們。

相關問題