7

ここではコーディングの問題はそれほど多くありませんが、セキュリティに関する一般的な質問です。私は現在、ユーザーがコンテンツを送信できるようにするプロジェクトに取り組んでいます。このコンテンツの重要な部分は、ユーザーがZipファイルをアップロードすることです。zipファイルにはmp3ファイルのみが含まれている必要があります。

次に、これらのファイルをサーバー上のディレクトリに解凍して、ユーザーが聴けるようにWebサイトでオーディオをストリーミングできるようにします。

私の懸念は、これにより、損傷を与える可能性のあるzipファイルが開かれることです。私は過去に「zipbombs」について読んだことがありますが、明らかに、悪意のあるzipファイルが損傷を引き起こすことは望んでいません。

それで、これを行う安全な方法はありますか?最初に解凍せずにzipファイルをスキャンできますか?MP3以外のものが含まれている場合は、ファイルを削除するか、管理者に警告のフラグを立てますか?

それが違いを生むなら、私はワードプレスでサイトを開発しています。私は現在、WordPressの組み込みのアップロード機能を使用して、ユーザーがzipファイルをサーバーにアップロードできるようにしています(WordPress内にzipファイルをスキャンするためのセキュリティがすでにあるかどうかはわかりませんか?)

4

3 に答える 3

3

コード、zip から MP3 のみを抽出、他はすべて無視

$zip = new ZipArchive();
$filename = 'newzip.zip';

if ($zip->open($filename)!==TRUE) {
   exit("cannot open <$filename>\n");
}

for ($i=0; $i<$zip->numFiles;$i++) {
   $info = $zip->statIndex($i);
   $file = pathinfo($info['name']);
   if(strtolower($file['extension']) == "mp3") {
        file_put_contents(basename($info['name']), $zip->getFromIndex($i));
   }

}
$zip->close();

ファイルの内容もmp3であることを確認するために、id3_get_versionhttp://www.php.net/manual/en/function.id3-get-version.php )のようなものを使用します

于 2013-02-12T14:15:06.490 に答える
2

彼らがMP3をZIPする必要がある理由はありますか?MP3のID3v2情報に多くのテキストフレームがない限り、辞書の保存により、ファイルサイズは実際にはZIPとともに増加します。

私の知る限り、ZIPを実際に解析せずにスキャンする方法はありません。ハフマン辞書を各ビットで実行するまで、データは不透明です。そして、どのファイルがMP3であるかをどのように判断しますか?ファイル拡張子で?フレームで?MP3エンコーダーの標準は緩く(デコーダーの仕様はより厳格です)、フォールスネガティブなしでファイル構造をスキャンすることは困難です。

ここにいくつかのZIPセキュリティリスクがあります:

  1. バッファオーバーフローの原因となるコメントデータ。解決策:コメントデータを削除します。
  2. 圧縮サイズは小さいが、ファイルシステムを埋めるために膨張するZIP(従来のZIP爆弾)。解決策:膨らませる前に膨らんだサイズを確認してください。辞書をチェックして、多くのエントリが含まれていること、および圧縮データがすべて1ではないことを確認します。
  3. ネストされたZIP(#2に関連)。解決策:ZIPアーカイブのエントリ自体がZIPデータである場合は停止します。これは、中央ディレクトリのマーカーである番号0x02014b50(16進数、ZIPでは常にリトルエンディアン-http ://en.wikipedia.org/wiki/Zip_%28file_format%29#Structure)を確認することで判断できます。
  4. ネストされたディレクトリ構造。ファイルシステムの制限を超えて、収縮プロセスを停止することを目的としています。解決策:ディレクトリを解凍しないでください。

したがって、多くのスクラブと整合性チェックを実行するか、少なくともPHPを使用してアーカイブをスキャンします。各ファイルのMP3性を確認します(ただし、拡張子とMP3ヘッダーの存在を確認します。ただし、バイト0にあることを信頼することはできません。http://en.wikipedia.org/wiki/MP3# File_structure)および収縮したファイルサイズ(http://www.php.net/manual/en/function.zip-entry-filesize.php)。膨らんだファイルが大きすぎる場合、またはMP3以外のファイルが存在する場合は、救済してください。

于 2013-02-12T14:29:24.443 に答える
1

.zip アーカイブ内のファイル名には、次のコードを使用します。

$zip = zip_open('test.zip');

while($entry = zip_read($zip)) {
    $file_name = zip_entry_name($entry);
    $ext = pathinfo($file_name, PATHINFO_EXTENSION);
    if(strtoupper($ext) !== 'MP3') {
        notify_admin($file_name);
    }
}

次のコードは拡張子のみを参照することに注意してください。つまり、ユーザーは MP3 拡張子を持つものなら何でもアップロードできます。ファイルが mp3 かどうかを実際に確認するには、ファイルを解凍する必要があります。一時ディレクトリでそれを行うことをお勧めします。

ファイルが解凍されたら、ffmpeg などを使用して分析できます。いずれにせよ、ビットレート、トラックの長さなどに関する詳細なデータがあると興味深いでしょう。

分析が失敗した場合は、ファイルにフラグを付けることができます。

于 2013-02-12T14:07:29.293 に答える