先日、LightningComponent上でサードパーティ製のライブラリを利用可能にするための仕組みとして、 LockerServiceがSalesforceのブログで発表された。
Introducing The LockerService For Lightning Components - Developer Relations
Lightning Locker Serviceのご紹介 | Salesforce Developers Japan Blog
リリースされていないけど、今回のブログをみたのとauraのソースを少しあさった事による所感。
LockerServiceでReact/Angularが使えるようになると言ってるけど、aura側で検閲処理入れたラッパー(SecureVirtualDOM)を返してくるようになるとのことで、ほんとに使えるようになるんだろうかこれ?
— mino0123 (@mino0123) 2016年4月18日
LockerServiceでReact/Angularが使えるようになると言ってるけど、aura側で検閲処理入れたラッパー(SecureVirtualDOM)を返してくるようになるとのことで、ほんとに使えるようになるんだろうかこれ?
— mino0123 (@mino0123) 2016年4月18日
auraのソースで見つけたLockerServiceで使われそうな各オブジェクトのラッパー実装。
https://github.com/forcedotcom/aura/tree/master/aura-impl/src/main/resources/aura/locker
— mino0123 (@mino0123) 2016年4月18日
Elementのプロパティにもホワイトリストがhttps://github.com/forcedotcom/aura/blob/a76e1c04eb7be858323161bc5e9098b3706ca56c/aura-impl/src/main/resources/aura/locker/SecureElement.js#L162
— mino0123 (@mino0123) 2016年4月18日
LockerService、生のオブジェクトを触る抜け道いくらでもありそうなんだけど、作ってる側はラッパーオブジェクトだけを使えるように制限することが可能でそれで安全確保できるとか考えてそうな気がちょっと
— mino0123 (@mino0123) 2016年4月18日
そもそもwindow上掛けないしそれはないか
— mino0123 (@mino0123) 2016年4月18日
Functionに文字列を渡すとコードとして実行できるが、その時にthisがグローバルオブジェクトになる。
ここにFunction('return this')()があるじゃろ?
— mino0123 (@mino0123) 2016年4月18日
JavaScriptではconsttuctorプロパティでオブジェクトのコンストラクタにアクセスできる。
コンストラクタは関数なのでFunctionのインスタンス。
つまり、あらゆるオブジェクトから.constructor.constructorでFunctionを取得できる。
単にアクセスするオブジェクトの名前でホワイトリスト作っても無駄。
c='constructor',(1)[c]c();
— mino0123 (@mino0123) 2016年4月19日
あと根本的な問題として、ブラウザ側は多分そんな用途を想定してない。
ブラウザ的にページ内の領域ごとにセキュリティ担保する方法を提供する方向性なんてないだろうし、仮に今raw windowへのアクセスを妨害可能だったとしても将来もそうである保証なんてないだろう
— mino0123 (@mino0123) 2016年4月19日
彼らの言うセキュリティは多分コンポーネント実装者に悪意があっても別のパッケージのコンポーネントが持つ情報にアクセスさせたくないとかいうレベルなんだろうけど実際に提供されるものは本当に悪意があったら簡単に回避できる上に通常の開発者への負担は膨大というシロモノになりそう
— mino0123 (@mino0123) 2016年4月19日
でもそれが可能なのかイマイチわからない
— mino0123 (@mino0123) 2016年4月19日
試してみたら
with({window:{}, document:{}}){
//...
}
の中に外部のコードを埋め込むことで一応挿げ替えはできそう。
と思って探したらそれっぽいことやってる部分あった。
上記のURLを返す ConfigAdapterImpl#getLockerWorkerURL() メソッド
このメソッドが返す値は以下のファイルでauraInitというMapにsafeEvalWorkerというキーで追加されている。
auraInit.put("safeEvalWorker", Aura.getConfigAdapter().getLockerWorkerURL());
たぶんこのマップがJSに渡るのだろう。safeEvalWorkerというキーがJSで使用されている。