Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中是否可以重写XMLHttpRequest.send(),然后检测并反转重写? 为什么我想知道_Javascript - Fatal编程技术网

在JavaScript中是否可以重写XMLHttpRequest.send(),然后检测并反转重写? 为什么我想知道

在JavaScript中是否可以重写XMLHttpRequest.send(),然后检测并反转重写? 为什么我想知道,javascript,Javascript,我们需要为一个大学项目编写XSS蠕虫,在这个项目中,这些蠕虫相互攻击。我们的目标是获得尽可能多的分数,这些分数是通过向服务器发送带有团队id的post请求生成的。每个蠕虫发送的post请求不得超过一个,并复制自身一次 为了获胜,我们可以攻击其他蠕虫。我们也被允许保护自己的蠕虫免受他人的攻击。因此,我们希望我们的蠕虫比其他蠕虫发出更成功的post请求 我考虑阻止或重写XMLHttpRequest的send()方法,以便其他蠕虫/团队的post请求将发送我们的团队id,或者根本不发送。但是我不熟悉J

我们需要为一个大学项目编写XSS蠕虫,在这个项目中,这些蠕虫相互攻击。我们的目标是获得尽可能多的分数,这些分数是通过向服务器发送带有团队id的post请求生成的。每个蠕虫发送的post请求不得超过一个,并复制自身一次

为了获胜,我们可以攻击其他蠕虫。我们也被允许保护自己的蠕虫免受他人的攻击。因此,我们希望我们的蠕虫比其他蠕虫发出更成功的post请求

我考虑阻止或重写
XMLHttpRequest
send()
方法,以便其他蠕虫/团队的post请求将发送我们的团队id,或者根本不发送。但是我不熟悉JavaScript,我不知道这样的东西是否可能

问题: 攻击 是否可以在JavaScript中重写类/对象(或该类/对象的函数)-尤其是
XMLHttpRequest
?如果是这样,被重写的类在全局上下文中是否仍然有效(从另一个
标记有效)

假设我们有第一个
标记,它包含以下内容:(不确定JavaScript是否正确)

还有第二个
标记,它使用
他们的团队id
调用
send()
方法:

const request = new XMLHttpRequest();
// ... configure request here
request.send(their_team_id);
来自第二个
标记的调用现在是否触发警报并将
我们的团队id
发送到服务器

保卫 是否可以检测重写的类/对象?如果是这样的话,我能以某种方式逆转更改或访问原始功能吗

假设我们只能在第二个
标记中编写代码,而第一个标记已经覆盖了
XMLHttpRequest
send()
方法,那么原始方法是否仍然可以访问



如果有人能想到另一个(更好的)攻击或防御向量,我想听听。

我相信重写
对象/函数是可能的。但是,只有当创建的变量/函数在当前屏幕上可见时,它才会起作用。请检查这个

JavaScript支持重写而不是重载,这意味着,如果您使用相同的名称定义了两个函数,那么最后定义的函数将重写先前定义的版本,并且每次调用该函数时,最后定义的函数都将被执行


我认为您想要的是重新定义XMLHttpRequest的
send
方法。 如果是这种情况,您可以执行以下操作:

//保存原始的'send'方法
const origSend=XMLHttpRequest.prototype.send;
//重新定义'send'方法
//如果需要,还可以传递额外的参数
XMLHttpRequest.prototype.send=(…origParams)=>{
log('send called');
origSend(…origParams);
}
const req=new XMLHttpRequest();
请求打开(“获取”http://www.example.org/example.txt");
请求发送();

//will print`send called`
我对这里的“class”和“override”这两个词的含义相当困惑。我明白了,现在编辑OK。还要注意,这更多的是关于JavaScript运行时环境,而不是关于JavaScript本身
window.XMLHttpRequest
是浏览器环境的一部分,而不是JavaScript的一部分。如果您的目标是修饰
XMLHttpRequest
,那么请确保您拥有正确的资本化权限。另外,要意识到
fetch
API不会调用
XMLHttpRequest#send
,因此这样做不会确保捕获所有HTTP请求。“现在是否有第二个脚本触发警报?”-您肯定已经尝试过了,并且发现答案是肯定的?!如果你能描述你真正想要完成的事情,你会得到更多有用的建议。太好了,谢谢!(我刚刚编辑了我的问题,而你发布了你的答案,似乎我几乎编写了你所做的代码)我如何检测甚至逆转对
send()
的更改?(假设我们无法访问
origSend
)@winklerr您可以通过
XMLHttpRequest.prototype.send.toString()检测它们“function send(){[native code]}”
-除非有人也重写了
function.prototype.toString
。这是一场军备竞赛,如果你是在页面中运行的第二个脚本,你肯定会失败,因为第一个脚本可以建立一个完全虚拟的环境,并“沙箱”你的蠕虫。我更新了我的问题,并提供了有关我问题的更多信息。
const request = new XMLHttpRequest();
// ... configure request here
request.send(their_team_id);