Вы должны использовать unsafeWindow
.Это действительно не то зло.
var string = unsafeWindow.g.toString();
unsafeWindow
относительно безопасно.Ранее я обнаружил способ доступа к неограниченному объекту window
в GreaseMonkey.Используя определенный метод, можно прочитать оригинальный код Userscript на соответствующей странице.Однако нельзя использовать определенные функции GreaseMonkey (GM_getValue
, ..): Advanced GreaseMonkey: использование конструкторов / методов / переменных на удаленной странице
РЕДАКТИРОВАТЬ, относительно изменения названия Если вы опасаетесь, что g
не является функцией или метод функции toString
перезаписан, используйте следующий код:
//Store unsafeWindow.g in a variable, to reduce the possibly defined
// __defineGetter__ calls to a minimum.
var g_string = unsafeWindow.g;
if(typeof g_string == "function"){
g_string = Function.prototype.toString.call(g_string);
}
else g_string = ""; //Reset
Безопасно ли это?
предыдущий код - самый безопасный подход, потому что никакие методы g
не вызываются.Оболочка GreaseMonkey также не позволяет уязвимой странице прочитать сценарий:
window.g = function(){}
window.__defineGetter__("g", function(){
alert(arguments.callee.caller);
});
В предыдущем коде будет показан не настоящий реальный вызывающий объект, а бесполезная функция обертки:
function SJOWContentBoundary() {
[native code]
}