受け付ける PDF
印刷・FAX で受け付ける PDF の条件(既定で拒否)。
方針は「明示的に許したものだけを通す」。印刷・FAX の PDF は、次の 3 つのすべてを通ったものだけを受け付ける。
11.2 検査 1: 構文(pdfcheck)
PDF の構文を正しく読む字句解析器で、ファイルのすべてのオブジェクトを読む。圧縮されたオブジェクトストリーム(FlateDecode)は展開して中まで見る。名前の #xx の書き換えは戻してから比べる。
- 見出し:
%PDF-1.0〜%PDF-1.7・%PDF-2.0だけ。 - 読めない構造は拒否: 閉じない文字列・長さの合わないストリーム・壊れた相互参照・
obj/endobjの欠け・不正な#など。 - ページ(
/Type /Page)が 1 つも無ければ拒否。
拒否する名前(どこにあっても。キーでも値でも)
| 分類 | 名前 |
|---|---|
| スクリプト・アクション | JavaScript JS Launch URI GoToR GoToE GoTo3DView SubmitForm ResetForm ImportData Hide Named Rendition OpenAction AA |
| フォーム | AcroForm XFA NeedsRendering |
| 添付・ポートフォリオ | EmbeddedFile EmbeddedFiles EF FileAttachment Collection |
| 3D・リッチメディア・動画・音声 | 3D 3DD 3DV 3DA 3DView U3D PRC RichMedia RichMediaContent RichMediaSettings RichMediaExecute Movie Sound Screen |
| 暗号化・利用権限 | Encrypt Crypt Perms UR3 |
| 危険な画像形式 | JBIG2Decode JBIG2Globals JPXDecode |
許す圧縮方式(これ以外は拒否)
FlateDecode(Fl)・LZWDecode(LZW)・ASCIIHexDecode(AHx)・ASCII85Decode(A85)・RunLengthDecode(RL)・CCITTFaxDecode(CCF)・DCTDecode(DCT)。
オブジェクトストリームは FlateDecode か圧縮なしだけで、DecodeParms があれば拒否。
拒否する /Subtype
Text FreeText Line Square Circle Polygon PolyLine Highlight Underline Squiggly StrikeOut Stamp Caret Ink Popup FileAttachment Sound Movie Widget Screen PrinterMark TrapNet Watermark 3D Redact Projection RichMedia PS。
フォント・画像・フォームの XObject などの Subtype は通す。
注釈
- 注釈(
/Type /Annot)は リンク(/Link)だけ。 - リンクに動作(
/A)があれば、/SがGoTo(文書の中のページへ飛ぶ)だけ。ほかは拒否。
構造の上限(正しくても、超えたら拒否)
| 項目 | 上限 |
|---|---|
| 配列・辞書の入れ子 | 32 |
| 名前の長さ | 127 |
| 1 つの文字列 | 1 MiB |
| 1 つの辞書の項目 | 10000 |
| 1 つの配列の要素 | 200000 |
| オブジェクトの総数 | 500000 |
| 1 つのオブジェクトストリームのオブジェクト数 | 100000 |
| オブジェクトストリームの展開後の合計 | 64 MiB(展開爆弾を防ぐ) |
| 相互参照表の行数 | 1000000 |
11.3 検査 2: PDF リーダー(PDFium)
PDFium(WebAssembly の中で動く)で開き、次を確かめる(raster.PageCount の analyze)。
- 開けること。
- 暗号化されていないこと(セキュリティハンドラーの版が -1)。
- JavaScript の動作が 0。
- 添付ファイルが 0。
- フォームが無いこと(
FPDF_FORMTYPE_NONE)。 - ページが 1 以上。すべてのページで、注釈がすべてリンクであること。
- 1 つでも該当すれば
422 pdf(「PDF を開けません」など)。PDF リーダーは 30 秒で待ちをやめる。
11.4 検査 3: 突き合わせ
- 検査 1 が数えたページ数と、PDFium が数えたページ数が違えば拒否(解釈が食い違う PDF には、何かが隠れている)。
- ページ数の上限・予算は、PDFium が数えたページ数で計る。
- PC では、署名つきの指示の
pagesより多ければ拒否する。
11.5 通るもの
利用者が添付した PDF を帳票に綴じる場合、その PDF に上の要素があれば拒否される。
11.6 取り込みの書類は別
取り込み(受け口)の書類は、PDF・JPEG・PNG・TIFF を先頭のバイトで確かめるだけで、中身は検査しない。サーバーは中身を解釈せず、「信用しない塊」として返す。 その書類を印刷するとき(取り込み → プリンター)は、上の検査を通る。
ご不明な点はお問い合わせください。