概要
サーブレットでHTTPリクエストのメッセージボディを取得する際に、
javax.servlet.HttpServletRequestのgetReader を使用すると
最大でも8,192バイトしか取得できないため結果異常となる場合があります。
影響のある製品
次の製品が該当します。
- WebOTX Application Server Express V9.2~9.4
- WebOTX Application Server Standard V9.2~9.4
- WebOTX Application Server Enterprise V9.2~9.4
詳細
以下の条件を同時に満たす場合に、8193バイト目以降のデータが取得できません。
- HTTPリクエストのメッセージボディサイズが8192バイトより大きい
- Webアプリケーション内で、javax.servlet.HttpServletRequestのgetReader
メソッドで取得したBufferedReaderを使ってリクエストメッセージボディを取得している。
例えば、下記の実装例で8192バイトを超えるメッセージボディを持つHTTPリクエストを
受信した場合、readLine では例外が発生せずに8192バイトちょうどのデータを取得
した時と同じ動作になります。
しかし、実際には必要なデータが取得できていないため、その後の処理において結果が異常に
なる場合があります。
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
BufferedReader br = request.getReader();
while((line = br.readLine()) != null){
・・・
}
・・・
}
|
対処方法
パッチの公開時期は現在検討中です。急ぎでパッチが必要な場合はご連絡ください。
回避方法
HttpServletRequestのgetInputStream メソッドで取得したServletInputStreamを利用して
リクエストデータを取得すると正常に処理できます。
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
ServletInputStream sis = request.getInputStream();
byte[] b = new byte[・・・
int size = 0;
while((size = sis.read(b)) > -1){
・・・
}
・・・
}
|
更新履歴