今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Google Chromeでローカルにファイルを出力するときの罠

大量のJSONファイルを編集する必要があるということで、JSONを扱うのならJavaScriptが簡単なんで、JavaScriptで自動化することにした。

JSONファイルを出力する必要があるので、ちょっとぐぐってみたら、Google Chrome だけが FileSystem APIに対応しているとかなんとかかんとか。

なるほどなるほどと、JSONを編集してファイルに出力してみた。
で、どこに出力されてるんだろうと、探すのに時間がかかったりして。やっと発見した出力先のファイルは、こんなところに存在した。

/Users/username/Library/Application Support/Google/Chrome/Default/File System/002/p/00/00000000

なんだか変なところに作られるんだなーとか思いつつ、ファイル名を指定してたのになんで 00000000 になってんだー?と。

さらにぐぐって、これを発見。

Section "4.3 Security Considerations" of the API specification addresses exactly the behavior you're attempting. If the client were to store the raw files with their actual file names (e.g., "FinanceReport.doc") then it would make things much easier for malicious software on a compromised machine to locate and exploit sensitive data stored through the File System API. Also, if the actual file name were used, then it could make those files executable, such as storing "EvilActions.exe" on the local file system with that name.
html5 - Is it possible to easy get normal (deobfuscated) access to all files in a sandbox written using FileSystem API? - Stack Overflow

いまやろうとしていることでは、FileSystem API によるファイル出力は使えないということを理解した。

そういえば node.js ってのがあったなー(いまさら)、とぐぐってみた。
なんだ、node.js なら超簡単だった。。。
バッチ処理なんで、非同期を使わないでコード書いた。

var fs = require('fs');

function writeJson(name, obj) {
    fs.writeFileSync(name, JSON.stringify(obj));
}