Windows
でインターネットからダウンロードしたファイルには下記画像のように、プロパティにセキュリティ
表示がされるかと思います。
こちらのブロックについて、PowerShell
で解除できるコマンドレットUnblock-File
のドキュメントを読んでいたら、記載があったのでまとめ。
ドキュメント
Unblock-File
5.1 NTFS Streams
5.6.1 Zone.Identifier Stream Name
本記事の環境
- Windows 10 21H2
- Edge バージョン 107.0.1418.42
- curl.exe 7.83.1 (Windows) libcurl/7.83.1 Schannel
そもそもUnblock-Fileって何してるの?
コマンドレットのドキュメントの説明に記載がありますが。
Unblock-File
コマンドレットが内部的にしている動作はZone.Identifier 代替データストリーム
の情報を削除しているようです。
Windows
では代替データストリーム
のZone.Identifier
が3
だったらインターネットから取得されたファイルを示すようなので、この情報を削除しています。
代替データストリームって?
Alternate Data Stream
で代替データストリーム。
NTFS
ファイルシステムではファイルデータ以外に代替データストリームとして様々な情報を追加できます。
ブラウザはインターネットからダウンロードしたファイルに、この代替データストリームのZoneId
を付与している。
代替データストリームを確認してみる(PowerShell)
代替データストリームの有無を確認するにはGet-Item
コマンドレットを利用します。
今回、ZoneId
を付与したZoneIdあり.txt
とZoneID
を付与しないZoneIDなし.txt
を用意して、Get-Item
コマンドレットのStream
オプションをつかってZone.Identifer
の有無を確認してみます。
ZoneIdあり.txt
では情報が表示され、ZoneIdなし.txt
のファイルはalternate data stream
を開けないとエラーがでている事を確認できます。
Edgeでgoogleのロゴ画像をダウンロードして代替データストリームの内容を確認してみる
Get-Item
コマンドレットでZoneID
の有無を確認しましたが、内容を確認するにはGet-Content
コマンドレットで確認できます。
ためしにgoogle.com
からブラウザ(Edge)でロゴ画像をダウンロードしてきてZoneID
を確認してみます。
google.comからロゴをダウンロードするとgooglelogo_color_272x92dp.png
というファイルが保存されました。
Get-Content
コマンドレットのStream
オプションで確認すると下記のように情報が取得できました。
ZoneId
がインターネットから取得した事を表す3
が設定されており。
またダウンロード元となった、ReferrerUrl
とHostUrl
の情報が付与されている事がわかります。
代替データストリームを確認してみる(CMD)
CMDではmore
コマンドがADSデータストリームに対応しており取得できるようです。
more < googlelogo_color_272x92dp.png:Zone.Identifier:$DATA
任意のファイルに代替データストリームのZone.Identifierに3 をフ付与してみる
PowerShellのSet-Content
コマンドのstream
オプションを利用して代替データストリームのコンテンツを作成、更新できます。
ここでは下記のコマンドを実行してsamplefile.txt
にZoneId
を付与してみます。
# サンプルファイルの作成
New-Item -ItemType File .\samplefile.txt
# ZoneIdが付与されていない事を確認
Get-Item .\samplefile.txt -Stream "Zone.Identifier"
# ZoneIdを付与
Set-Content .\samplefile.txt -Stream "Zone.Identifier" -Value @("[ZoneTransfer]","ZoneId=3")
# ZoneIdが付与されている事を確認
Get-Item .\samplefile.txt -Stream "Zone.Identifier"
# ZoneIdの内容を確認
Get-Content .\samplefile.txt -Stream "Zone.Identifier"
samplefile.txtにZoneId
が付与された事が確認できました。
ダウンロードするアプリケーションによってはZoneIdが付与されない
ブラウザからではなくファイルをダウンロードする方法によってはZoneId
は付与されません。
curl.exe
や Invoke-WebRequest
で試しに、googleのロゴをダウンロードしてみるとZoneId
が付与されてない状態でダウンロードされる事が確認できます。
総評
Windowsでブラウザからダウンロードしたファイルがインターネットからダウンロードされた物だと判別する仕組みは、NTFSファイルシステムの代替データストリームのZone.Identifier
を利用していると理解できたかと思います。