1

私の上司は、この非常に複雑なソフトウェアを 10 年前のように作成し、VPS にセットアップしたばかりの新しい IIS 7 サーバーに移行するように私に依頼しました。タイムアウトして CPU を 100% にする小さなループを除いて、すべてがスムーズに機能するように管理しました。

これが犯人です:

rs_ss.open  "SELECT DISTINCT idMC, idUtente, Categoria FROM forte01.RisorseS WHERE idmc=" & request.querystring("idmc") & " and idutente=" & session("idutente") &  " order by  categoria" ,conn 

if not rs_ss.eof then
     do while not rs_ss.eof

        'conta gli elementi della sottosezione
        rse.filter ="categoria='" & rs_ss("categoria") & "'"
        if not rse.eof then
            n=0
            do while not rse.eof        
                rse.movenext
                n=n+1
            loop
            rse.movefirst   
            r=1
            do while not rse.eof
                dettagliarisorse rse, "s_ss",r ,n
                r=r+1
                rse.movenext
            loop
        end if
        rse.filter =""
        rs_ss.movenext
     loop
end if
rs_ss.close

中央部分を次のように削除またはコメントアウトすると、次のようになります。

rs_ss.open  "SELECT DISTINCT idMC, idUtente, Categoria FROM forte01.RisorseS WHERE idmc=" & request.querystring("idmc") & " and idutente=" & session("idutente") &  " order by  categoria" ,conn 

if not rs_ss.eof then
 do while not rs_ss.eof
   rs_ss.movenext
 loop
end if
rs_ss.close

それはやり続けます。

古いドメインでは問題なく動作します。理由はありますか?

4

2 に答える 2

0

問題は、Sql Server のユーザー権限にありました。ユーザーには、その特定のスキーマへのアクセス権がありませんでした。

于 2013-10-27T10:14:53.803 に答える
0

コードの先頭にあるそのクエリで返されるデータによって異なります。大量の行が返される場合、行のカウントに非常に時間がかかります。カテゴリの出現回数をカウントするようにクエリを書き直して、コードで実行しないようにして、n = n + 1 の周りのループを削除できるようにします。

また、一番上のクエリには、非常に大きな禁止事項があります。生のクエリ文字列値をインライン SQL クエリに直接渡しています。これは、SQL インジェクション攻撃に対して脆弱なコードの例です。クエリ文字列「idmc」を介して渡される値は、SQL インジェクション攻撃のエントリ ポイントとして簡単に使用できます。これが整数の数値である場合、少なくともこれを関数でラップして、自由形式のテキストをインライン SQL に渡すことを許可しないようにします。すなわち

CInt(Trim(request.querystring("idmc")))
于 2013-10-24T21:39:30.747 に答える