1.はじめに
実際には、統計情報のリクエストや特定の形式でのデータのエクスポートが非常に一般的であることがわかります。たとえば、顧客の統計レポート、売上請求書、購買請求書などをエクスポートしたいという要求を受けます。これには、人 (特にプログラマー) がソフトウェアを作成する必要があります。それぞれの特定の状況や要件に応じて、データをエクスポートするためのテンプレートを柔軟に作成できます。 WordやExcelなどを利用したソリューションがすぐに思い浮かぶかもしれませんが、このソリューションはソフトウェア料金やデータ処理時間の負担もかかる上、継続的に変化し、短期間で発展する可能性のある大量のデータには適していません。は最適ではありません。
現在、多くのプログラマーが好んで使用する JasperReports ライブラリという非常に人気のあるソリューションがあります。
特に、このライブラリはオープンソースであり、無料版があります。ソース コードには https://github.com/TIBCOSoftware/jasperreports
2.使用説明書
このライブラリの使用方法についてはオンラインでたくさん説明されているため、ここでは詳しく書きません。
Eclipse を使用している場合、JasperReports にはレポート テンプレートの作成に役立つ追加のプラグインがあります。
この記事では、IntelliJ IDEA でライブラリ マネージャーを Maven で使用する方法を説明します。
まず、データ (注文書、請求書など) を入力するためのテンプレートが必要です。これを行うには、Jaspersoft Studio ソフトウェアをダウンロードしてインストールしてください (最新のコミュニティ バージョンのリンクは現在 https://community.jaspersoft.com/files/file/19-jaspersoft®-studio-community-edition /?do=getNewComment です)。
インストールして開くと、ソフトウェアには次のインターフェイスが表示されます:
新しいテンプレートを作成するには、[ファイル] -> に移動します。新規 ->ジャスパーレポート。 [すべて] セクションで、[空白の A4] (またはお好みの別のテンプレート) を選択します。
「次へ」をクリックして、ファイルを保存する場所を投影します。 「次へ」をクリックします ->次へ ->仕上げる。表示される新しいインターフェイスはテンプレート画面で、テンプレートに従って自由にデザインできます。
右側はライブラリでサポートされているオブジェクトです。
タイトルと商品名を含む簡単な購入請求書フォームを作成する必要があるとします。 「静的テキスト」オブジェクトをテンプレートにドラッグ&ドロップし、「購入請求書」という名前を入力します(形式は画面の右隅で自分で調整できます)。
次に、同様のオブジェクトをさらに 2 つドラッグしますが、アイテム カテゴリを「Books」と「Pens」の下に作成します。
次に、これら 2 つの商品の価格を追加する必要があります。この値は動的であるため、ここに変数を含める必要があります (これは、このライブラリの非常に興味深い柔軟な機能でもあります)。アウトラインセクションのパラメータセクションで右クリックし、「パラメータの作成」を選択します。次に、右隅のウィンドウでこの変数の値を変更しました。変数名は book、データ型は実数です。
次に、それを「Book」ラベルの横にドラッグ アンド ドロップしました。変数「pen」と合計金額も同様です。ここで、割り当てることができる合計金額は、変数「本」と「ペン」の合計に等しくなります。
テンプレートが完成すると、こんな感じになります
ソース タブに切り替えると、これがシステムが処理するデータになります。基本的に、Jasper Report は XML に似たファイル形式で入力データを受け取りますが、タグ名はライブラリによって事前に定義されます。たとえば、ファイル全体のスーパークラスの開始タグと終了タグは「jasperReport」タグである必要があります。注意が必要なテンプレートのシンボルをいくつか示します:
完了したら、このファイルをプロジェクトにコピーして、データを入力して処理できます。
次に、次のライブラリのインポートに進みます:
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.21.0</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports-fonts</artifactId> <version>6.21.0</version> </dependency>
ファイルをインポートし、データを入力するためのコードを書き続けます。
final String outputFilename = "report.pdf"; Files.deleteIfExists(new File(outputFilename).toPath()); InputStream inputStream = Main.class.getResourceAsStream("/report.jrxml"); Map<String, Object> parameters = new HashMap<>(); parameters.put("book", 55000); parameters.put("pen", 11111.1111); JasperReport jasperReport = JasperCompileManager.compileReport(inputStream); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource()); JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilename);
ここでは直接入力しているため、Map クラスを使用できます。データソース (データベースなど) からデータを入力したい場合は、(https://www.baeldung.com/spring-jasper) を参照してください。
結果は以下の通りです
3.安全なプログラミング
このテンプレートをレンダリングするプロセスで、ライブラリはその内部の関数も実行するため、ユーザーがテンプレート タグをカスタマイズできる場合、攻撃者はコマンドを実行できる悪意のあるタグを追加することになります。このエラーは SSTI に非常によく似ています。
ユーザーがテンプレートを直接編集できるとします。ソースコードは次のとおりです:
final String outputFilename = "out.pdf"; Files.deleteIfExists(new File(outputFilename).toPath()); String input = ""; String template = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jasperReport xmlns=\"http://jasperreports.sourceforge.net/jasperreports\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd\" name=\"z\" pageWidth=\"500\" pageHeight=\"1200\" columnWidth=\"270\">\n" + input + "</jasperReport>"; InputStream inputStream = new ByteArrayInputStream(template.getBytes()); JasperReport jasperReport = JasperCompileManager.compileReport(inputStream); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource()); JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilename);
攻撃者は悪意のある機能を埋め込んでシステムを制御します:
文字列入力 = "<パラメータ名="cmd"> <p>その結果、コマンドが実行されます。ファイル「out.pdf」には次の内容が含まれています:</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173597147572303.jpg" alt="Giới thiệu căn bản về thư viện JasperReports"></p> <p>そのため、プログラマは、ユーザーがテンプレートにコンテンツを直接入力できないように注意する必要もあります。<br> さらに、このライブラリには古いバージョン (<em>CVE-2018-18809、CVE-2022-42889</em> など) にも脆弱性があるため、プログラミングする際には最新バージョンを使用して更新する必要があることに注意してください。定期的に。</p>
以上がJasperReports ライブラリの基本的な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。