Как я могу предоставить ограниченный интерфейс для GMasexkey GM_xmlhttpRequest к Javascript моей страницы?

1

У меня есть пользовательский скрипт Greasemonkey, который выполняет большую часть своего кода в непривилегированном контексте, вставляя тег <script> так:

function code {
  ...
}

var script = document.createElement("script");
script.type = "application/javascript";
script.innerHTML = "(" + code + ")();";
document.body.appendChild(script);

Это позволяет избежать необходимости делать опасные вещи с помощью unsafeWindow.

Однако, мне мой код должен получить информацию от API в другом домене, который не поддерживает JSONP. GM_xmlhttpRequest может обращаться к другим доменам, но доступен только в привилегированном контексте Greasemonkey.

Я хотел бы написать функцию, которая предоставляет ограниченный интерфейс и делает именно вызов API, который мне нужен, используя GM_xmlhttpRequest, а затем выставлять эту (теоретически безопасную) функцию в обычный контекст страницы. Моя первая попытка в этом была чем-то вроде:

unsafeWindow.foo = function() {
  console.log("Foo!");
  console.log(GM_xmlhttpRequest.toString());
  GM_xmlhttpRequest({
    method: "GET",
    url: "http://www.example.net/",
    headers: {
      "User-Agent": navigator.userAgent,
      "Accept": "text/html"
    },
    onload: function(response) {
      console.log(response);
      unsafeWindow.console.log(response);
      alert(response);
      unsafeWindow.alert(response);
    }
  });
  console.log("Bar!");
};

Интересно, что когда я вызываю foo() из контекста страницы, я вижу "Foo!", стробированный GM_xmlhttpRequest и "Bar!". в журнале консоли. Тем не менее, я никогда не получаю ответ в консоли или в предупреждении. Если я сам создаю GM_xmlhttpRequest в контексте GM, я получаю предупреждения и сообщения журнала.

Вопрос в том, что я пытаюсь сделать даже возможно? Или есть другой способ выполнить одно и то же?

  • 0
    Почему вы запускаете свой код в непривилегированном контексте?
  • 1
    Мне нужно взаимодействовать с существующим скриптом на странице, что больно (и небезопасно) делать напрямую из контекста Greasemonkey. Это включает в себя гораздо больше небезопасных окон.
Теги:
security
greasemonkey

1 ответ

1
Лучший ответ

Ага! Ответ был отправлен на аналогичный вопрос.

Greasemonkey делает это очень преднамеренно и обеспечивает простой способ обхода 0.7.20080121.0.:

unsafeWindow.foo = function() {
  window.setTimeout(GM_xmlhttpRequest, 0, {
    // ...
  });
};

Это работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню