ChromeでGreasemonkey / FirefoxのunsafeWindow機能を模倣するにはどうすればよいですか?
-
06-07-2019 - |
質問
私は今クロムでユーザースクリプトをいじっているだけですので、私の潜在的な無知/愚かさを我慢してください。
スクリプトを作成しているページには、変数<script>
を宣言するx
要素があります。
これは、ユーザースクリプトで、グローバル名前空間からalert(x);
にアクセスできるということですか?
たとえば、ユーザースクリプト内の唯一の行が<=>である場合、それは期待どおりに機能する必要があります(<=>が文字列であると仮定)?クロムは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リリースでは機能しなくなりました。
ChromeでunsafeWindow
機能を取得するには、をインストールして使用することをお勧めしますTampermonkey -関係なく、あなたは賢くするでしょう。 TampermonkeyはGreasemonkey APIを完全にサポートしており、スクリプト管理がはるかに簡単です。
GreasemonkeyスクリプトとTampermonkeyスクリプトはほとんどの場合完全に互換性があり、これはプレーンなChromeユーザースクリプトには当てはまりません。
Tampermonkeyを忘れて、まだ機能する唯一の代替手段は、何らかの形式のスクリプトインジェクションを使用することです。
以下は廃止されました。
Chromeはuserscripts / content-scriptsに対して<=>を定義するようになりましたが、Chromeの<=>は引き続きアクセスを許可しませんターゲットページによって作成されたJSオブジェクトに。
機能の検出を使用するクロスブラウザの方法で、適切に安全でない<=>を提供する方法は次のとおりです。 / em>(良い)対ブラウザスニッフィング(悪い):
/*--- 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.
okは、アドレスバーを使用してスクリプトを挿入できるアイデアです...
javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm);
その後、javascriptを使用してウィンドウ内で必要なものを実行できます