プロトタイプが汚染されたヨ〜😭
これからどうなっちゃうの!?
プロトタイプが汚染されたヨ〜😭
これからどうなっちゃうの!?
はじまるよ〜〜〜〜〜!!!!
自己紹介
趣味でやっていること
プロトタイプやグローバルの汚染が怖い
当たり前だけど、汚染は怖い
プロトタイプやグローバルの汚染が怖い
当たり前だけど、汚染は怖い
クライアントサイド(3rd party script)も
サーバーサイドも
サードパーティスクリプトって広告以外にもいろいろある
汚染してくるコードは意外とある
グローバル汚染
Zone.js
(Angular
非同期処理
ライブラリ)
汚染してくるコードは意外とある
グローバル汚染
Zone.js
(Angular
非同期処理
ライブラリ)
手がこんでるねえ😇
汚染してくるコードは意外とある
プロトタイプ汚染
有名なSaaSの
OSSライブラリ
汚染してくるコードは意外とある
汚染というか
チェーン差し込み?
どっかのサイト
不要なpolyfill、polyfillのバグ
不要なpolyfill、polyfillのバグ
現状の対策: どうにかしてrealmを作る
iframeの例
それができないこともある
汚染まわりをECMAScriptはどう思っているんだろう
汚染まわりをECMAScriptはどう思っているんだろう
汚染まわりをECMAScriptはどう思っているんだろう
Object.freeze()というものがあるよ
Object.freeze()をやる前
Object.freeze()をやると!!
Object.freeze()をやると!!
上書きできなくなってる!!
いい感じ!
Object.freeze()をやると!!
上書きできなくなってる!!
いい感じ!
でも既に汚れてたらどうする?
既に汚れているものをObject.freeze()
してもしょうがない
👶「もっとすごいのないの〜?」
Secure ECMAScript, Jessie...
Frozen Realmと呼ばれていたやつ
どういう状況なのか?
Kris Kowal
QやCJSを
作ったすごい人
SESまわりで
活躍している
どういう状況なのか?
Secure ECMAScriptは
に分解されたよ
どういう状況なのか?
見てみよう
Secure ECMAScriptは
に分解されたよ
ShadowRealm
1度目の検索は
絶対に遊戯王のカードにたどり着いてしまう
恐ろしいproposal
ShadowRealmは相当前からある
ShadowRealmができること
ShadowRealmのインターフェース
👶「これで全部解決や!!!」
👶「これで全部解決や!!!」
ShadowRealmでは
web APIがほぼ使えない……!
たしかにDOMとか論外だよね
realmの隔離が目的であって、
グローバルに強く結びついたDOMだとかを
ShadowRealmから操作するのは論外
👶「なにか他のものがほしいね」
Compartmentはどうか?
いろいろ制御した
仮想環境を作れる
Compartmentはどうか?
いろいろ制御した
仮想環境を作れる
と思っていた時代が私にもありました
Compartmentのスコープはモジュールローディングに限定された
Compartmentの現在の内容(stage 1)
冷静に、CompartmentもけっきょくShadowRealmと同じ話になるのでは?
API使えるのかな……
Compartmentもある種globalThisを隔離する
👉 ShadowRealmと同じように省かれるかも?
ではHardened JavaScriptは?
Hardened JavaScriptの概要
これけっこう安全では?
👉とにかく安全!
でも冷静に……
Object.freeze()と同じで、
既に汚染されていたら凍らせても、、、ねえ?
それに、Hardened JavaScript上で動くライブラリと動かないライブラリが併存したらどうなるの??
けっきょく……隔離も凍結もむずくない?
取り出す系はないのか?
proposal-get-intrinsic
proposal-get-intrinsic
proposal-get-intrinsic
👶「任意のタイミングで汚染されていないオリジナルのプロトタイプがとれる!これだ!」
proposal-get-intrinsic
👶「任意のタイミングで汚染されていないオリジナルのプロトタイプがとれる!これだ!」
と思っていた時代が私にもありました
proposalをよく読んでみると
proposalをよく読んでみると
呼び出された時点でのprototypeを
キャッシュして
後続のみんなで取り回す仕組みらしい
だからfirst-run code、
つまり一番最初のコードで呼び出される
想定らしい
proposalをよく読んでみると
呼び出された時点でのprototypeを
キャッシュして
後続のみんなで取り回す仕組みらしい
だからfirst-run code、
つまり一番最初のコードで呼び出される
想定らしい
汚染されてたら、
汚染されたものが取り回されるってワケ
👀「それなにがメリットなんですか?」
まとめ
参考にさせて頂いたソース