jsセキュリティわかんない
オブジェクト作ったときにメソッドをreadonlyにしたい。
extensionでwindow(GMでいうunsafeWindow)に追加したオブジェクトのメソッドをGMでunsafeWindowで参照したい。
でも悪意あるページにそのメソッドを書き換えられちゃうとGMコンテキストで任意コードを実行しちゃうので困る。
だからsetterを空にしてあげればいいじゃーんと思った。
var cross_context_instance = { callme: function (str) { console.log(str); }, get callme () { return function (str) { console.log(str); } }, set callme () { } }; cross_context_instance.callme = function () { console.log("jacked"); } cross_context_instance.callme("hello");
setterで何もしなければ書き換えられることなし。helloが出る。やった!と思ったけど間に
cross_context_instance.callme.__defineGetter__("callme", function () { return function () { console.log("jacked"); } } )
って書いたらふつうにgetterがかえられるのでやっぱり意味なし。
だったら__defineGetter__つぶせばいいんじゃないのってことで cross_context_instance に
__defineGetter__: null
をついかして
var cross_context_instance = { callme: function (str) { console.log(str); }, get callme () { return function (str) { console.log(str); } }, set callme () { } __defineGetter__: null }; cross_context_instance.callme = function () { console.log("jacked"); } cross_context_instance.callme.__defineGetter__("callme", function () { return function () { console.log("jacked"); } } ) cross_context_instance.callme("hello");
にするとあとからgetterを上書きすることもできなくなってhelloが出るようになる。めでたしめでたし、じゃねーよ。こんな意味わかんないやりかたじゃ安心できない。
cross_context_instance.callme.__defineGetter__ は nullになってるのに cross_context_instance.callme.__defineGetter__( ) でなんのエラーがでないのはなんでだ。
eval, __parent__, caller, setter/getter でjsにはセキュリティ上の飛び道具おおすぎ。
そういうの考えないといけなくなるようなのはきっぱりさっぱりあきらめるべきなのか。