コンテンツにスキップ

NextPDF Symfony のセキュリティと運用

レスポンスヘルパーは、固定のセキュリティヘッダーセットを適用します。非同期メッセージ DTO は、その出力パスを 2 回検証します。署名はオプションであり、Pro ティアでは、ここで説明するベースラインプロファイルに限定されます。

NextPDF\Symfony\Http\PdfResponse は、構築するすべてのレスポンス(インライン、ダウンロード、および両方のストリーミングバリアント)に同じヘッダーセットを適用します。ソース定数と照合済みの正確なヘッダーは次のとおりです。

ヘッダー
Cache-Controlprivate, max-age=0, must-revalidate
Pragmapublic
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY
Content-Security-Policydefault-src 'none'
X-Robots-Tagnoindex, nofollow
Referrer-Policyno-referrer

これらは、生成されたドキュメントの content-type スニッフィング、フレーミング、インデックス登録、リファラーの漏洩を軽減します。バッファリングされたバリアントは、さらに Content-Type: application/pdfContent-Length を設定します。ストリーミングバリアントはコンテンツタイプを設定しますが、設計上 Content-Length を省略します。

ヘッダーセットはバンドルによって固定されています。ヘッダーを追加または変更するには(たとえば、認証済みダウンロード向けにより厳格な Cache-Control)、返された Response を、返す前にコントローラー内で変更してください。

PdfResponse は、PdfResponseTest で検証されているとおり、Content-Disposition ヘッダーを防御的に構築します。

  • ファイル名はサニタイズされ、パス区切り文字とトラバーサルシーケンスは除去されます(../../../etc/passwd.pdf のようなファイル名でエスケープすることはできません)。
  • 拡張子が存在しない場合は .pdf 拡張子が付加されます。既存の拡張子は重複して付加されず、大文字の .PDF も対象です。
  • 引用符付き文字列形式に合わせて、二重引用符とバックスラッシュはエスケープされます。
  • 非 ASCII のファイル名には、ASCII フォールバック RFC-5987 の filename*=UTF-8'' バリアントがどちらも付与されます。
  • 空のファイル名は document.pdf にフォールバックします。

ユーザーの影響を受けるファイル名は、アプリケーションレベルで独自の認可チェックを行った後にのみ渡してください。バンドルがサニタイズするのはヘッダーの安全性のためであり、アクセス制御のためではありません。

NextPDF\Symfony\Message\GeneratePdfMessage はコンストラクター内で出力パスを検証し、NextPDF\Symfony\Message\GeneratePdfHandler は書き込み前の実行時にそれを再検証します。構築時に検証される拒否ルールは次のとおりです。

  • 空のパス、または null バイトを含むパス。
  • php://... のようなストリームラッパースキーム。
  • 区切り文字として / または \ のいずれかを使用する .. トラバーサルセグメント。
  • 末尾が .pdf で終わらないパス(大文字・小文字を区別しない)。
  • 構文的に有効なクラス名ではない builderClass

メッセージはディスパッチされてから消費されるまでの間キューに残り続ける可能性があるため、ハンドラー内での 2 回目の検証が重要です。ハンドラーはキューに入れられたパスを信頼せず、保存前にパスガードを再度適用します。ワーカーは、意図した出力ディレクトリにスコープを限定した最小権限のファイルシステムアカウントで実行してください。

GeneratePdfHandler は、クラス名をキーとする PSR-11 サービスロケーターからビルダーを解決し、PdfBuilderInterface ではないものをすべて拒否します。ロケーターは登録済みのビルダーのみを公開するため、改ざんされたトランスポートペイロード上で攻撃者が制御する builderClass は、任意のクラスをインスタンス化できません。PSR-11 では、コンテナーが ID は存在しないと報告した場合、予期しないものを暗黙的に返すのではなく、その解決は失敗します(PSR-11 §1.1.2)。ロケーターには信頼できるビルダークラスのみを登録してください。

デジタル署名は、コアバンドルの一部では ありません。これは、nextpdf/premium(Pro ティア)が存在し、コンパイラーパスが Pro 署名クラスを検出した場合にのみ有効になります。バンドルと Pro ティアがインストールされている場合、サポートされ、文書化されている署名構成は ベースライン B-B プロファイルです。

構成の signature.level ノードは、NextPDF 構成ファミリー全体でのスキーマ互換性のために、追加の文字列値を受け入れます。このバンドルが提供し、サポートする署名機能は B-B です。B-B を超える署名プロファイル、その要件、およびその運用上の考慮事項は NextPDF Premium のドキュメントに記載されており、ここでは意図的に説明していません。

B-B 署名パスに関する運用上の注意事項は次のとおりです。

  • 署名者が登録されるのは、signature.enabled が true であり、かつ signature.certificate が設定されている場合 のみ です。それ以外の場合、この設定セクションは効果を持ちません。
  • 証明書、秘密鍵、およびパスワードは、リポジトリにコミットせず、Symfony secrets または環境変数を通じて提供してください。
  • 鍵マテリアルに対する読み取り権限を、アプリケーションアカウントに制限してください。

フォントレジストリと画像レジストリは、任意の Psr\Log\LoggerInterfacenullOnInvalid() でバインドされる)を受け入れます。存在する場合、それは PSR-3 ロガーコントラクト(PSR-3)に従って交換可能なコラボレーターです。ドキュメント生成の前後で追加するログコンテキストからは、ユーザーを識別するデータを除去してください。バンドルはドキュメントの内容をログに記録しません。

  • 固定のレスポンスヘッダーを維持してください。認証済みダウンロードに対するより厳格なキャッシュは、コントローラーで重ねて適用してください。
  • ドキュメントを生成または返す前に、リクエストを認可してください。バンドルはアクセス制御を実行しません。
  • 署名鍵マテリアルは、最小権限のファイル権限を設定したうえで、Symfony secrets/環境変数に保管してください。
  • Messenger ワーカーは、書き込みアクセスを出力ディレクトリに限定した最小権限のアカウントで実行してください。
  • 拡張機能 ext-mbstringext-zlib を有効なままにしてください(そうでない場合、バンドルは早期に失敗します)。
  • デプロイ間でエンジンバージョンが決定論的になるように、アプリケーションでは単一の nextpdf/core メジャーバージョンに固定してください。

各行は、このページで提示する規範的な主張であり、ゲート付きの SDO コーパスからの完全な 64 桁の 16 進数 reference_id に紐付けられています。プロベナンス(コーパスマニフェスト、取得トランスポート)は _sidecars/rag-citations.yaml にあります。

仕様条項リファレンス ID主張
PSR-11psr_11_container#1.1.2.p5has() が false の場合は get() が NotFoundException をスロー
PSR-3psr_3_logger#x3.p17任意のロガーコラボレーター

デジタル署名は、nextpdf/premium(Pro)がインストールされている場合にのみ利用できます。このバンドルが提供するプロファイルはベースライン B-B です。これはオプションの Pro 機能です。ここで説明している Core バンドルでは、これを採用するためのコード変更は不要です。 </get-license/?intent=symfony-pro> を参照してください。

  • /integrations/symfony/production-usage/ — ワーカーの安全性とストリーミング。
  • /integrations/symfony/configuration/ — signature、tsa、およびサービスのテーブル。
  • /integrations/symfony/troubleshooting/ — 署名と Messenger の問題の診断。
  • /integrations/symfony/integration/ — エンドツーエンドの配線リファレンス。