ZIP解凍
ZIPアーカイブをアップロードしてファイルをプレビュー・抽出、個別ダウンロードまたは一括解凍
ZIPファイルをここにドラッグ、またはクリックして選択
.zip形式のアーカイブファイルに対応
ZIP解凍とは?
ZIP 解凍は、アーカイブを開いて中に保存されたファイルを取り出す処理です。圧縮されたパッケージを受け取ったとき、中身を先に確認したい、必要なファイルだけ取り出したい、ファイル名やサイズを確認してから信頼したい、といった場面で役立ちます。通常のファイルでは ZIP 解凍は可逆であり、取り出した内容は圧縮前と同じであるべきです。ただし、解凍したからといって中身が安全になるわけではありません。アーカイブには紛らわしいファイル名、予期しないフォルダー、展開後に巨大になるデータ、開くべきでない実行ファイルが含まれることがあります。このブラウザツールはローカルで読み取り、選択したファイルを保存できますが、不審な ZIP の安全確認の代わりにはなりません。
使い方
使い方
- ZIPファイルをアップロードエリアにドラッグするか、「ZIPファイルを選択」ボタンをクリックしてください
- アーカイブ内のファイル一覧と各ファイルの情報を表示します
- 個別ファイルの「ダウンロード」をクリックして展開します
- 「すべて解凍」をクリックすると、すべてのファイルをZIPでダウンロードします
展開の安全性
- ダウンロード前にファイル一覧を確認してください。特に、出所不明のアーカイブでは重要です
- 実行可能ファイルや入れ子のアーカイブ、怪しいファイル名には注意してください
利用シーン
仕組み
ZIPアーカイブの読み取りは、書き込みの逆順で行われます。ブラウザはFile API(`file.arrayBuffer()`)を通じてファイルを`ArrayBuffer`として受け取り、リーダーはファイル末尾から逆方向にスキャンしてEnd of Central Directory署名`0x06054b50`(PK\x05\x06)を探します。EOCDは最大22バイト+最大65,535バイトのオプションコメントで構成されるため、スキャン範囲は限定的です。EOCDはセントラルディレクトリのオフセットとサイズを指し示し、セントラルディレクトリにはエントリごとに1つのFile Header(`0x02014b50`)が格納されます。各File Headerには圧縮サイズ・非圧縮サイズ・CRC-32・圧縮方式・ファイル名、そして対応するLocal File Header(`0x04034b50`)のオフセットが含まれます。リーダーは前のエントリを解析せずに任意のエントリに直接シークできるため、数ギガバイトのバックアップから単一ファイルを抽出する処理が高速です。 解凍は方式バイトに依存します:`0x00`はstored(非圧縮、memcpyのみ)、`0x08`はRFC 1951準拠のDEFLATE(実世界のアーカイブの約99%)、`0x0C`はBZIP2、`0x0E`はLZMA、`0x5D`は旧式のPPMdです。本ツールではJSZip(またはより高速なfflateを使用 — fflateの`unzipSync`は典型的な10MBのDEFLATEアーカイブを数十ミリ秒でデコードし、JSZipの数倍の速度)を採用しています。解凍後、生バイトのCRC-32を再計算し、セントラルディレクトリの値と照合します。不一致は破損または改ざんを示します。 抽出コードパスにおいて2つのセキュリティ上の問題が重要です。1つ目はZip Slip脆弱性(Snyk、2018年)です。悪意あるアーカイブに`../../etc/passwd`のようなパストラバーサルシーケンスを含むエントリが含まれており、エントリ名をターゲットディレクトリに結合するだけの単純な抽出処理では、意図したサンドボックス外にファイルが書き出されてしまいます。修正方法は、結合されたパスを`path.resolve()`で正規化し、書き込み前にターゲットディレクトリで始まることを検証することです。本ツールでは各エントリを`URL.createObjectURL(new Blob([bytes]))`による個別のブラウザダウンロードとして提供し、ブラウザが保存先をサンドボックス化するため、ディレクトリトラバーサルはユーザーのダウンロードフォルダー外に脱出できませんが、サーバーサイドの抽出処理では同じアーカイブが悪用される可能性があります。2つ目は暗号化アーカイブの未対応です。従来のZipCryptoは3バイトの既知平文攻撃で簡単に破れる32ビットストリーム暗号であり、近代的なWinZip AES-256(PKWARE APPNOTE 7.0)はHMAC-SHA1認証付きAE-2拡張フィールドを必要としますが、いずれもここでは実装されていません。4GiB超のアーカイブはZIP64拡張のextra fieldsによる64ビットサイズとオフセットに依存し、パーサーは32ビットのセントラルディレクトリフィールドの代わりにこれらを読み取る必要があります。
- 解析順序:ファイル末尾からEOCD署名`0x06054b50`を逆方向にスキャン(末尾から最大22+65535バイト)→ セントラルディレクトリにシーク → 各Local File Headerにシーク。
- 圧縮方式:`0x00` stored、`0x08` DEFLATE(RFC 1951、アーカイブの約99%)、`0x0C` BZIP2、`0x0E` LZMA、`0x5D` PPMd。
- 整合性検証:多項式`0xEDB88320`(反転IEEE 802.3)によるCRC-32を展開バイトに再計算し、セントラルディレクトリの値と照合。
- Zip Slip(Snyk 2018):`../`パストラバーサルを含むエントリが展開ディレクトリ外に書き出し可能な脆弱性。解決策はパスを正規化して検証後に書き込み。
- ブラウザ実装:`File.arrayBuffer()` → JSZip / fflate `unzipSync()` → エントリごとの`URL.createObjectURL(new Blob([bytes]))`によるダウンロード。サーバー通信なし。
- 暗号化未対応:ZipCryptoは3バイトの既知平文攻撃で解読可能。WinZip AES-256(APPNOTE 7.0、HMAC-SHA1付きAE-2拡張フィールド)は未実装。
- ZIP64(APPNOTE 4.5+):32ビットのサイズ・オフセットフィールドをextra fieldsで64ビットに拡張。4GiB超(2³²−1バイト)のアーカイブまたは単一エントリに必須。
使用例
アーカイブ内容の確認
解凍ソフトをインストールせずに、ブラウザ上で ZIP アーカイブ内のファイル一覧を直接確認単一ファイルの取り出し
全体を解凍せず、必要なファイルだけをアーカイブからダウンロード一括解凍
アーカイブ内の全ファイルをワンクリックで解凍してダウンロードよくある質問
解凍のために ZIP がアップロードされますか?
いいえ。本ページは FileReader API を使って ZIP をローカルで読み取り、JSZip でブラウザ内でエントリを展開します。ファイルはデバイスを離れません。解凍中にネットワークタブで確認できます。
どの ZIP バリアントに対応していますか?
DEFLATE 圧縮を使った標準的な ZIP ファイル(最も一般的なバリアント)です。Stored(無圧縮)エントリも動作します。ZIP64(4 GB を超えるアーカイブ用)はほとんどのビルドでサポートされています。暗号化エントリ(パスワード保護)と 7Z、RAR、TAR には対応していません。それらには専用ツールを使ってください。
パスワード保護された ZIP を解凍できますか?
基本的にできません。JSZip は ZipCrypto 暗号化や AES 暗号化エントリを扱えません。先にデスクトップの 7-Zip や WinRAR で復号し、構造を確認したい場合はそれを再パックしてここにアップロードしてください。
ZIP に中国語や日本語のファイル名がある場合はどうなりますか?
本ページはデフォルトでファイル名を UTF-8 として読み取ります。古い Windows で作成された ZIP は、UTF-8 フラグを設定せずに GBK(中国語)や Shift_JIS(日本語)でファイル名を保存していることがあり、その場合は文字化けして表示されます。UTF-8 対応のツールで ZIP を作り直すか、デスクトップの 7-Zip で正しいコードページ設定を使ってください。
ファイルサイズの上限は何ですか?
ブラウザのメモリです。最近のデスクトップなら 1 GB を超える ZIP も扱えますが、モバイルブラウザは数百MB あたりでメモリ不足になります。非常に大規模なアーカイブにはディスクからストリームするデスクトップツールを使ってください。
解凍せずにファイルの内容をプレビューできますか?
テキストファイルなら可能です。任意のエントリをペーストまたはクリックすると、本ページがその内容を表示します。画像はサムネイルとしてプレビューされます。バイナリエントリ(実行ファイル、ネストされた ZIP など)はメタデータのみが表示されるので、確認するにはダウンロードしてください。
ドットファイルや隠しファイルも展開されますか?
はい。ZIP には「隠し」属性の概念がなく、すべてのエントリが可視です。ドットで始まるファイル名(.gitignore、.env)も通常通り展開され、普通のファイルとして扱われます。