2

モジュールのコード監査レポートに対する問題を修正しています。問題はXSSの脆弱性です。構文response.getOutputStream()。write(buffer);で問題が報告されています。それを修正する方法は?私は十分な宿題をしましたが、OWASPが推奨するESAPIがそれを修正するのに役立つことがわかりましたが、どのように実装するのですか?問題はサーブレットクラスにありますか?または他のAPIまたは他の何かが私がそれを修正するのを助けることができますか?関連する経験を共有してください。

FileOutputStream fos = null;
        FileInputStream fileInuptStream =null;
        BufferedInputStream bufferedInputStream = null;
        ByteArrayOutputStream byteArrayOutputStream =null;
        try{
           ServletContext servletContext = request.getSession().getServletContext();
            File attachmentDir = new File(servletContext.getRealPath("")+File.separator+"Reports" );
            String uploadDir=attachmentDir.getPath();
            if (!attachmentDir.exists()) {
                attachmentDir.mkdirs();
            }

            HSSFWorkbook wb= new HSSFWorkbook();
             AAAA  aaa=new AAAA();          
            wb=aaa.getExportXLS(request, response, fileName, wb);
             if(request.getSession().getAttribute("SESSION_AAAAA")!=null){
                    request.getSession().removeAttribute("SESSION_AAAAA");
            }           
              fos=new FileOutputStream(uploadDir+File.separator+fileName);
            wb.write(fos);

            File fileXls=new File(uploadDir+File.separator+fileName);
              fileInuptStream = new FileInputStream(fileXls);
              bufferedInputStream = new BufferedInputStream(fileInuptStream);
              byteArrayOutputStream = new ByteArrayOutputStream();
            int start = INT_ZERO;
            int length = ONE_ZERO_TWO_FOUR;
            int offset = MINUS_ONE;
            byte [] buffer = new byte [length];
            while ((offset = bufferedInputStream.read(buffer, start, length)) != -1)
                byteArrayOutputStream.write(buffer, start, offset);


            buffer = byteArrayOutputStream.toByteArray();

            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
            response.setContentType("application/xls");
            response.setHeader("Content-disposition","attachment; filename="+fileName );
            response.setContentLength((int ) fileXls.length());
            response.getOutputStream().write(buffer);  --- REPORTED AT THIS LINE
            response.getOutputStream().flush(); 
4

2 に答える 2

1

これは誤った警告です。このサーブレットは、HTMLドキュメントではなく、ApachePOIによって作成されたXLSファイルを返します。XSS攻撃の手段があり得ない可能性があります。

ただし、このコードはかなり不器用で非効率的です。展開されたWARフォルダーにファイルを作成し(WARが再デプロイされると、とにかく失われます)、応答に直接書き込むのではなく、コンテンツ全体をサーバーのメモリに完全にコピーします。おそらく、この不器用なアプローチは監査ツールを混乱させました。HttpServletResponse#getOutputStream()代わりにに渡す必要がありますWorkbook#write()

これまでに投稿されたコードに基づいた完全な書き直しは次のとおりです。

HSSFWorkbook wb = new HSSFWorkbook();
AAAA aaa = new AAAA();          
wb = aaa.getExportXLS(request, response, fileName, wb);
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/xls");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
wb.write(response.getOutputStream());
于 2012-06-12T14:12:42.647 に答える
1

リクエストはメソッドの入力として直接取得されるため、入力と出力を検証する必要があります。ESAPIを使用して、ESAPIのgetValidatedFileContent()を使用してバッファフィールドを検証します。fileNameインジェクション攻撃のfileNameフィールドを検証します。また、リクエストを入力として持つメソッドからの出力として取得されるファイルは、厳密に検証する必要があります。

于 2012-06-29T09:40:15.220 に答える