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 は、実際の "where" 句ではなく、実際の SQL コードを実行しています。

次に、最終的な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

それはまだ安全ではなく、非パフォーマンスです。

sp_executeSQL に依存するのではなく、SQL を動的に実行し、そこにパラメータを追加する必要があります。

@プレースホルダー アイテムの値を使用して文字列を作成し、cmd.Parameters.AddWithValue("@placeholder", value)それらのパラメーターを追加すると、一般に、ステートメントを最適化できないため、SQL の時間が無駄にならず、より安全で管理しやすくなります。

SQLはこれらのステートメントをすべてキャッシュし、同一のステートメントが発生した場合に再実行するため、ストアドプロシージャではなくコードで動的に実行すると、実際にはパフォーマンスが向上する場合があります。

于 2013-07-07T01:38:41.593 に答える