ここに来て立て続けに、アップロードされたzipファイルを解凍した中身を反映するコードを書いてきましたが、実のところ、これらで利用している PEAR::Archive_Zip には、穴があります。
それは具体的には以下の2点です。
(1) ファイルシステムに解凍すると、Directory Traversalがある
(2) 解凍処理でメモリをすべて食いつぶすようなzipファイルが簡単に作成可能である
このうち、(1)に対しては明確な対応策があります。ファイルシステム上に解凍しなければ良いのです。
$reader = new Archive_Zip( (アップロードテンポラリファイル) ) ;
$files = $reader->extract( array( 'extract_as_string' => true ) ) ;