解決済み: Piping Server (TypeScript) 0.12.0からブラウザにダウンロード強制させることによるセキュリティと利便性のトレードオフに関しての思考
セキュリティと利便性のトレードオフが発生中。それに対して思考を書く場所。
0.12.0からContent-Type: text/htmlをブラウザで開いてもダウンロードされるようになった。
また、Content-Typeが指定されてない場合は、application/octet-streamが付与されるようになった。
最初の変更点、HTMLは強制的にダウンロードは対策済み: 適当なHTMLを踏ませてService WorkerでPiping Serverの質素なWeb UIのトップページを書き換えられる件に関して手法/危険性/対策などの対策のためで多少利便性が下がっているがしょうがない。
text/htmlはtext/plainに書き換えてブラウザでソースコードとして表示させる案もあるが、元のContent-Typeを書き換えてしまうのはどうかな?と思ってやらなかった。
GitHubのrawとかはXMLとかでもtext/plain返しているし、text/plainはある意味HTMLの上位概念と捉えられるからこっちのほうが、自動でダウンロードされず、したければctr + sなどですれば良いので良いかもしれない。
本当に書きたいのは、application/octet-streamを付与することによる弊害。
これはContent-Typeがなくてもブラウザやリバースプロキシが自動でHTMLとして判別したするためにこのようにした。
ブラウザがContent-Typeなしでも勝手に自動判別するかどうかは以下のコマンドで試せる。
$ echo -e "HTTP/1.1 200 OK\nContent-Length: 14\n\n<h1>hello</h1>" | nc -l 8081
何が弊害か?
echo hello | curl -T - ...のようなシンプルな送信もブラウザで開くとダウンロードされてしまう。
curlでダウンロードすればターミナルに表示されるだけだが、ブラウザで確認することもよくある。
解決策
追記: => 0.14.0にて、サーバー側でService Worker (PWA)を無効化する方法を利用して、Service Workerの登録を無効化したため、application/octet-streamを付与しないように変更され、上記の弊害はなくなった。
Piping Server上でデータを判別してテキストならtext/plainを付与する。
これはストリーミングを遅くする可能性があり避けたい気持ちがある。
あと、テキストかどうかの判別は完璧にはできないはずである。
Piping Serverの質素なWeb UIとは別にWeb UIを別のドメインなどに設ける。
Piping Chunkみたいな感じ。
これが一番現実的で良い案だと思っている
質素なWeb UIを廃止して、HTMLはダウンロードさせない元の状態に戻す
廃止すれば、どんなHTMLも誰かが表示させたものになるため、すべてのHTMLを疑うことが出来るようになる
ただ、Piping Serverはじめての人がブラウザで訪れたときに、それがあたかも公式かのように見えるので、事前知識なしでも安全に使えるようにするようにはできない。