嘿,伙计,我在谷歌搜索后看到你的问题,因为我对同样的主题感兴趣,我有点沮丧,其他人似乎不明白你在问什么......但在想了想,我居然提出了一个解决方案!
首先,如果您要编写 chrome 扩展,我将向您展示如何做到这一点,这将是保证我们拦截脚本源的最简单方法,但也有一种方法可以在不制作扩展的情况下做到这一点,请参见下文。
基本上,假设您有一些要为其编写插件的网站,其中包含一些 HTML 内容,例如:
<script src="http://www.someURL.com/someFile.js"></script>
文件 someFile.js 的内容如下:
(function() {
function cantGetMeMethod() {
}
})();
因此,用户在执行 HTML 的主页上无法获取函数“cantGetMeMethod”。
问题是,如果我们能够简单地更改该 JavaScript 文件的源代码,我们可以轻松移除匿名函数包装,或者在底部插入某种全局变量引用。
但是我们怎么可能从客户端更改 JavaScript 源代码呢?
这就是 chrome 扩展的用武之地。使用扩展,可以将在页面加载之前在网站上任何地方发出的 HTTP 请求重定向到另一个网站。因此,例如,如果一个页面有这样的图像:
<img src="http://example.com/somePic.png"></img>
该扩展程序可以将来自 example.com 的所有请求重定向到另一个网站,因此显示的真实图像(使用扩展程序的客户端)实际上可能来自其他网站,并且是完全不同的图像!
这与 JavaScript 有什么关系?
因为同样的原理也适用于 JavaScript 源代码。我们所要做的就是找到对其他文件的 JavaScript 引用,并使用扩展名将 src URL 重定向到我们自己的服务器,并将原始 src URL 作为获取参数。假设我们有一些 nodeJS 站点或托管在 http://www.myAwesomeNodeJSserverOrSomething.com 的东西,所以我们将所有对 http://www.someURL.com/someFile.js 的调用(或至少相关的脚本调用)重定向到 http://www.myAwesomeNodeJSserverOrSomething.com/http://www.someURL.com/someFile.js
然后在 nodeJS 端执行如下操作:
require("http")
.createServer((q,r) => {
http.get(q.url.slice(1), req => {
let str = "";
req.on("data", d => str += d.toString())
req.on("end", () => {
let newCode = someFunctionThatModifiesCode(str);
r.end(newCode);
});
}); //pseudocode obviously, check for errors etc. for real
}).listen(8080);
现在页面已经修改了 JavaScript 代码!那么我们如何制作一个重定向标题的快速扩展呢?首先,创建一个新目录,并在其中创建一个名为 manifest.json 的文件,如下所示:
{
"name":"JavaScript cracking the codes",
"version":"1.0",
"description":"hi",
"manifest_version":2,
"permissions": [
"webRequest",
"webRequestBlocking",
"<all_urls>"
],
"background": {
"scripts":["lol.js"],
"persistent": true
}
}
现在在同一目录中创建一个新文件“lol.js”,并在其中放入如下内容:
let otherServer = "http://www.myAwesomeNodeJSserverOrSomething.com",
urlsToRedirect = [ //list of javascript files that need fine tuning
"http://www.someURL.com/someFile.js",
"http://www.someURL.com/someFile2.js",
"http://www.someURL.com/someFile3.js",
];
chrome.webRequest.onBeforeRequest.addListener(
details => {
if(
urlsToRedirect.includes(
details
.url
)
) {
{
redirectUrl: (
otherServer
+ "/"
+ details.url
)
}
}
},
{urls: ["<all_urls>"]},
["blocking"]
);
(警告:未经测试的代码)
然后进入chrome设置,进入开发者模式,加载一个新的扩展,然后选择那个文件夹。
此外,如果您自己只是这样做,那么在没有扩展的情况下执行此操作的方法是在页面加载之前注入一个mutationobserver 脚本,类似于篡改猴子。有关更多信息,请参阅 https://github.com/CertainPerformance/Stack-Exchange-Userscripts/blob/master/obsolete/Experiment-Off/StackExperimentOff.user.js https://stackoverflow.com/a/59424277/2016831
让我知道这是否可以解决您的问题。