Извлечь значение из функции страницы ... ¿Без unsafeWindow? - PullRequest
2 голосов
/ 23 октября 2011

Я новичок в Greasemonkey.Я пытаюсь создать пользовательский скрипт для улучшения моего пользовательского опыта с сайтом, который я часто посещаю.

Поэтому я хотел бы создать функцию javascript f().Моя функция требует значения, которое, согласно моим быстрым исследованиям и попыткам понять структуру сайта, существует только внутри функции javascript g().

Я не уверен, какой файл содержит g() на сервере, но я знаю, что после завершения загрузки страницы можно использовать g().

Я бы хотел извлечь строковое значение из g() без его выполнения (с помощью g.toString()).

Мой вопрос: как я могу получить доступ к g(), не ставя под угрозу мой компьютер?с unsafeWindow?(window.g возвращает null внутри скрипта Greasemonkey).

1 Ответ

1 голос
/ 23 октября 2011

Вы должны использовать 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]
}
...