Как я могу имитировать незащищенную функциональность Greasemonkey / Firefox в Chrome?
-
06-07-2019 - |
Вопрос
Прямо сейчас я просто возлюсь с пользовательскими скриптами в Chrome, поэтому, пожалуйста, примите во внимание мое потенциальное невежество / идиотизм.
На странице, для которой я пишу сценарий, есть <script>
элемент, объявляющий переменную x
.Означает ли это, что в моем пользовательском скрипте я могу просто получить доступ x
из глобального пространства имен?
Например, если единственной строкой в моем пользовательском скрипте является alert(x);
, должно ли это работать так, как ожидалось (предполагая x
является строкой)?Я понимаю, что chrome не поддерживает unsafewindow, но по какой-то причине я не могу понять, как имитировать функциональность.Возможно ли это вообще?
Решение
contentWindow
был доступен в Chrome 3, но удален в Chrome 4 . Единственно возможное решение для Chrome 4:
location.href="javascript:(function(){ alert('Hello'); })()"
Другие советы
Это даст вам ссылку на объект окна (как p):
var p = unsafeWindow;
if(window.navigator.vendor.match(/Google/)) {
var div = document.createElement("div");
div.setAttribute("onclick", "return window;");
p = div.onclick();
};
Обновить:
Тот Самый onclick
эксплойт больше не работает в последних версиях Chrome.
Чтобы получить unsafeWindow
функциональность в Chrome лучше всего установить и использовать Взломщик - Обезьяна -- что было бы разумно с твоей стороны сделать, несмотря ни на что.Tampermonkey имеет полную поддержку Greasemonkey API и значительно упрощает управление скриптами.
Скрипты Greasemonkey и Tampermonkey почти всегда полностью совместимы, чего нельзя сказать о простых пользовательских скриптах Chrome.
Отказываясь от Tampermonkey, единственная альтернатива, которая все еще работает, - это использовать какую-либо форму внедрение скрипта.
Следующее в настоящее время устарело:
Chrome теперь определяет unsafeWindow
для пользовательских скриптов / content-скриптов, но Chrome's unsafeWindow
по-прежнему не разрешает доступ к объектам JS, созданным целевой страницей.
Вот как обеспечить надлежащий небезопасный, unsafeWindow
-- кроссбраузерным способом, который использует Обнаружение признаков (хорошо) по сравнению Обнюхивание браузера (Плохо):
/*--- Create a proper unsafeWindow object on browsers where it doesn't exist
(Chrome, mainly).
Chrome now defines unsafeWindow, but does not give it the same access to
a page's javascript that a properly unsafe, unsafeWindow has.
This code remedies that.
*/
var bGreasemonkeyServiceDefined = false;
try {
if (typeof Components.interfaces.gmIGreasemonkeyService === "object") {
bGreasemonkeyServiceDefined = true;
}
}
catch (err) {
//Ignore.
}
if ( typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
unsafeWindow = ( function () {
var dummyElem = document.createElement('p');
dummyElem.setAttribute ('onclick', 'return window;');
return dummyElem.onclick ();
} ) ();
}
Если вы хотите взаимодействовать со страницей JavaScript, вам нужно будет вставить скрипт на страницу. (Если, конечно, вы не хотите использовать какие-либо хаки, предложенные на этой странице.) Я подготовил функцию, предназначенную именно для этого, для моих собственных сценариев, я опубликую ее здесь на случай, если кто-то захочет ее использовать.
/*
@description This function will insert the given code as a <script> or <style> block into a page.
@param The code to insert; supported types are: JavaScript Function, String (JavaScript), String (CSS).
@param2 Optional: The type of code that is inserted. If omitted, "js" is assumed. Possible values are 'js' or 'css'.
@return The HTML element that was inserted, or FALSE on failure
*/
function insert(z,t){
var j,f,x,c,i,n,d
d=document
c=d.createElement
i=d.head.appendChild
a=d.createTextNode
if(typeof z==='function') j=!0,f=!0;
if((t=='js'||!t)&&!f){j=!0,f=!1}
if(t=='css'&&!j){x=c('style');x.setAttribute('type','text/css')}
if(j){x=c('script');x.setAttribute('type','text/javascript')}
if(f) n=a('('+z+')()');else n=a(z)
x.appendChild(n)
if(x){return i(x)}else{return !1}
}
Несколько примеров для пояснения:
//Inserting a JavaScript function
var func=function(){
stopAds();
startFileDownload();
}
insert(func);
//Inserting JavaScript as a string
var strJS="prompt(\"Copy:\",someVariableAtThePage);";
insert(strJS);
//Or with an OPTIONAL 2nd parameter:
insert(strJS,'js');
//Inserting CSS
var strCSS=".ad{display:none !important} #downloadButton{display:block}";
insert(strCSS,'css');//Specifying 2nd parameter as "css" is required.
Хорошо, вот идея, что вы можете добавить скрипт, используя адресную строку ...
javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm);
тогда вы можете запускать все что угодно в окне с вашим javascript