【TCPDF】バージョンアップに伴うセキュリティ設定方法の変更(Ver.4系→Ver.5系)

2010.06.10 Author: Jas

以前にも紹介したことがあるTCPDFですが、先月にメジャーバージョンがあがったので早速試してみることにしました。

半年ほど前にVer.4.8で作成したプログラムが問題なく動作していたので、バージョンアップによる影響はないと思っていたのですが・・・思いがけない部分で仕様変更を発見しました。

Ver.4系からVer.5系へのバージョンアップ時に権限設定の仕様が真逆になっているようなので、注意が必要です。
対象になっているのは、PDFにセキュリティ設定を行う時に使用する関数で SetProtection() です。

印刷だけを許可するPDFを作成するつもりで、以下のようにプログラムを書いて実行しました。

$pdf->SetProtection(array('print'), $user_password, $owner_password);

すると、Ver.5.3では印刷だけ「許可しない」になってしまいました。
tcpdf5.png

ちなみに、Ver.4.8で同じプログラムを書くとこうなります。
tcpdf4.png

マニュアルの通りに実装したのですが想定外の結果になったので、ソースコードを確認すると…
なんと、関数の仕様が全く変わっているではありませんか!!

■TCPDF Ver.4.8の場合
@param Array $permissions the set of permissions. Empty by default (only viewing is allowed).

SetProtection($permissions=array(), $user_pass='', $owner_pass=null)

権限の指定方法は引数の説明にある通り、許可するものを配列に追加します。
そのため、第一引数にarray('print')を指定すると、印刷だけ許可されます。

■TCPDF Ver.5.3の場合
@param Array $permissions the set of permissions (specify the ones you want to block):

SetProtection($permissions=array('print', 'modify', 'copy', 'annot-forms', 'fill-forms', 'extract', 'assemble', 'print-high'), $user_pass='', $owner_pass=null, $mode=0, $pubkeys=null)

権限の指定方法に関する引数の説明が「ブロックしたいものをしていすること」と書き換わっています。
最初の例では、第一引数にarray('print')を指定すると、印刷が「許可しない」になっていたのです。

Ver.5系で印刷だけを許可したい場合は、以下のように書き直す必要があります。

$pdf->SetProtection(
array('modify', 'copy', 'annot-forms', 'fill-forms', 'extract', 'assemble'),
$user_password,
$owner_password
);


念のため、ChangeLogも確認してみると、以下のような記述を発見しました。

5.0.005 (2010-05-12)
- WARNING: The logic of permissions on the SetProtection() method has been inverted and extended (see example 16). Now you have to specify the features you want to block.
- SetProtection() method was extended to support RSA and AES 128 encryption and public-keys (see example 16).

ChangeLogをちゃんと読めということですね。
セキュリティにもかかわることなので、気が付かずに移行していたら大変なことになるところでした。

ちなみに、上記のChangeLog抜粋部分に書いてある通り、RC4 128 bit、 AES 128 bit での暗号化および公開鍵暗号方式にも対応したようです。

どんどん便利になっていきますね~!

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ