https://devblog.thebase.in/entry/2022/09/06/110000
基盤チームの右京です。
昨今はフロントエンドのアプリケーションもリッチになり、ブラウザ上で実行されるコードが行うことの範囲も増えてきました。一方で多くのことを実装できてしまうのはリスクでもあり、BASE でも問題となることがあります。
その中でも「開発環境の URL」や「デバッグ機能の存在」ような環境毎に異なる情報は、特に意図せずに漏れやすいものだと考えています。これらはコードを記述する際に、実装方法を知識として知っていればその多くが回避可能です。この記事ではその実装例を解説しています。
例えば、次のようなコードがあるとします。
function debug() {
// 開発環境の host であればデバッグ機能を有効にする
return location.host === 'dev.kankyo.com';
}
なんの変哲もないようなコードに見えますが、ブラウザ上で実行されるコードとしては非常に良くないものだと言えます。通常 JavaScript をブラウザで実行する場合、ソースコードが直接取得されるため、その内容は利用者が閲覧することできます。つまり「秘匿情報の開発環境の URL が、比較的誰でも簡単に入手できるものに記載されてしまっている」ということになります。
Minifier や Compressor を用いて難読化を行ったとしても、(このままでは)この URL の情報が消えることはありません。location.host
という変数と比較をするため、"dev.kankyo.com"
は実行時まで必要なコードだからです。
殆どの場合は次のうちいずれかの方法で解決できるでしょう。
前者の 2 つは馴染みのある方法で、最後の 1 つはフロントエンド特有のものです。
HTML を配信するサーバーサイドのプログラムがある場合、環境による変化はそちらでコントロールします。今回の例では、デバッグ機能を利用したい場合にそのフラグを input
で埋め込むような形にします。
<input type="hidden" id="debug" value="1">