2016-08-17 9 views
0

からダウンロードすることが確実にできるようGUIDを使用して公開されているディレクトリに保存し、このファイルへのリンクを提供します。は、私は現在、(Javaの/ POIで作成)に敏感なユーザーが生成したExcelファイルは、ファイル名を作成することにより、サーバからダウンロードできるように、私は <p>Tomcat8/Javaの</p>を使用するユーザーが生成したファイルをサーバー

ステージ1

ユーザーがJSPは、Javaファイルに送信する様々なパラメータを、選択

String fileName = "excelFiles/" 
       + myReports 
         .createExcel(listCompanyDetails); 

public static String createExcel(List listCompanyDetails) { 
     String fileName = "MyFile"+UUID.randomUUID() + ".xls"; 
     String fileFullPath="\..."+fileName; 
     FileInputStream inputStream = new FileInputStream(new File(APPCodeTable.templateExcelFile)); 
     Workbook wb=new HSSFWorkbook(inputStream); 
     FileOutputStream out = new FileOutputStream(fileFullPath); 
     wb.write(out); 
     out.close(); 
} 

ステージJSP次いでiframe内のファイルを表示する2

<iframe id="target_upload" name="target_upload" width="100%" 
src="<%=fileName%>" height="100%"></iframe> 

私たちのシステムで行われた侵入テストの結果では、代わりにjspファイルからストリームでファイルを生成する必要があります。これはGUIDの使用を避けるため、より安全です。ログイン許可をバイパスするファイルへのリンク。

ただし、サーブレットを使用する方がコード作成の方が優れているようです。例えば、Implementing a simple file download servlet

ドキュメントをサーバーに保存し、GUIDで識別し、このGUIDをサーブレットに渡すことを検討していました。しかし、これは私の本来のセキュリティ向上意向を打ち破っているようです。

単純なダウンロードサーブレット(添付リンクのように)を実装すると、作成したファイルをそのサーブレットの中にどのようにして入れることができますか?

+0

単に任意のセキュリティ問題に対処していないようですサーブレットを介してこれをストリーミング - 特に静的なres Tomcatを介して提供されるourcesは、サーブレット(catalina DefaultServlet)によってすでに提供されています。だから、この質問に答えるには、セキュリティの発見が実際に何であるかをよりよく理解する必要があります(対照解の提案された解決策)。 –

+0

私はセキュリティ問題に関して少し質問を更新しました – gordon613

+0

"しかし、このステートメントは必ずしも真実ではありません(または、それが真実である理由の裏にある理由は明らかではありません)。実際にXLSXを「オンザフライで」生成している場合(つまり、HttpServletRequestによって起動された場合)、WorkbookをFileOutputStreamに書き出す代わりに、HttpServletResponseのoutputStreamに書き出すことになります。例えば新しいWorkbook()。write(httpServletResponse.getOutputStream())これよりももう少しですが、このアプローチが実行可能なように見える場合は、回答の形で詳細を書きます。 –

答えて

0

ステージ1のファイルに書き込んでステージ2でそのファイルを読み込む代わりに、ワークブックをHttpServletResponse.getOutputStream()に書き込むことで、2つのステップを効果的に1つに縮小できます。

1. は、(<form>で行われていると仮定して)ユーザーパラメータを収集し、IFRAMEをターゲットにしてPOSTします。例えば

<form action="reportservlet/MyReport.xls" method="POST" target="target_upload"> 

2. セットアップは、新しいサーブレット+マッピング(*マッピングはMyReport.xls部分がフォームを送信するときに、その場で構築何かをanything..includingすることができます)。サーブレットで

<servlet> 
    <servlet-name>ReportServlet</servlet-name> 
    <servlet-class>foo.ReportServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ReportServlet</servlet-name> 
    <url-pattern>/reportservlet/*</url-pattern> 
</servlet-mapping> 

3. 、のようなものが

public void doPost(HttpServletRequest req, HttpServletResponse rsp) throws ServletException { 
    // all the security stuff and stuff to produce List listCompanyDetails 
    FileInputStream inputStream = new FileInputStream(new File(APPCodeTable.templateExcelFile)); 
    Workbook wb=new HSSFWorkbook(inputStream); 
    rsp.setContentType("application/vnd.ms-excel"); 
    wb.write(rsp.getOutputStream()); // this is the key...write directly to the request output vs. a temp file 
} 

いくつかの論評...

    (servlet..thisのビジネスロジックの "悪いデザイン" を無視することは唯一の実証です)
  1. 私は、a)IEを使用し、b)Excelがインストールされている - IFRAMEでのExcelコンテンツのターゲティングがかなり悪い考えである、よく制御されたユーザーのために開発していると仮定しています。
  2. 推奨されるサーブレットの代わりにJSPを使用しないでください。バイナリデータを生成するためにJSPを使用することはちょうど「悪い考えです」。技術的には可能ですが、JSPを正しく構成しないと、XLSを破損するような文字データ(ほとんど見えにくい改行や後続のスペース)が発生する可能性があります。
+0

ありがとうございました。休日からちょうど戻ってきました - 返事が遅れて申し訳ありません...私の 'List listCompanyDetails'を 'doPost'サーブレットにどのように渡すのですか? – gordon613

0

@Implementing a simple file download servlet

からウェンの答えはまた私がHow to deny web access to a Tomcat directoryに@Ramesh PVKの提案を使用してファイルが保存されたディレクトリへの直接ウェブアクセスを削除

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name >precluded methods</web-resource-name> 
    <url-pattern >/excelFiles/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint/> 
</security-constraint> 
関連する問題