【问题标题】:Unable to execute Javascript on certain websites via script injection无法通过脚本注入在某些网站上执行 Javascript
【发布时间】:2018-07-19 06:09:07
【问题描述】:

我试图在页面加载后将 React 脚本注入网站/

我能够让它在大多数网站上运行,例如 https://google.comhttps://discovercard.comhttps://stackoverflow.comhttps://capitalone.com

但是,当我在 https://chase.comhttps://bankofamerica.com 中执行相同的脚本时,我在使用 Babel.transform 转换 JSX 时遇到参考错误,因为 @ 987654328@ 未定义。

然而,所有必需的脚本都已下载,如网络选项卡和 DOM 中所示。

如果 HTML 中有任何特定的标签或属性阻止在这些网站上执行 Javascript,请告诉我。似乎银行网站这样做是为了防止外部 Javascript。

这是我在开发者控制台上尝试的代码

注意:世界你好!由于setTimeout

,在 5 秒后出现
const react = document.createElement("script");
react.src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.production.min.js"
document.body.appendChild(react);

const reactDom = document.createElement("script");
reactDom.src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.production.min.js"
document.body.appendChild(reactDom);

const babel = document.createElement("script");
babel.src = "https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"
document.body.appendChild(babel);

const rootDiv = document.createElement("div");
rootDiv.id = "app";
rootDiv.style="width: 100px; height: 100px; position: absolute; top: 0px; left: 0px; z-index: 999999";
document.body.appendChild(rootDiv);

setTimeout(() => {
  const babelScript = document.createElement("script");
  babelScript.type = "text/babel";

  const jsxCode = "ReactDOM.render(<h1>Hello, world!</h1>, document.getElementById('app'));"

  const babelTransformCode = Babel.transform(jsxCode, { presets: ["react"] } ).code;

  eval(babelTransformCode);
}, 5000)

【问题讨论】:

  • 您应该为要注入的脚本处理onload 事件,而不是任意超时。
  • 同意,但我只是想测试一下,看看有什么不同。
  • 这可能是不同的。我不只是为了笑而建议它:p
  • 你的意思是脚本需要时间来加载?我不这么认为,我尝试了 25 秒的超时,仍然没有骰子,我可以看到脚本正在从网络选项卡加载。使用fetch 也不起作用。
  • 嗯,这是一个建议,你可能是对的,它不会解决它。我实际上并不太介意尝试帮助您将脚本注入银行网站。我很高兴有一个日志,以防万一需要它作为证据:)

标签: javascript html javascript-injection


【解决方案1】:

这两个不工作的网站都在使用 requireJs,所以它们不是在 window 上加载模块,而是使用 define 加载。

做起来很简单,只需在脚本的其余部分之前调用define = undefined,它就可以像处理其他站点一样工作。为了安全起见,UMD 加载器似乎也会检查 export 和 modules.exports,因此您可能也希望将它们设置为 undefined。

define = undefined;
exports = undefined;
if (window.module) module.exports = undefined;

您正在使用的库是使用通用模块定义打包在一起的。这样他们就可以使用各种各样的模块加载器,例如 requireJs。 UMD 模式查找由模块加载器定义的公共变量,因此通过将这些变量设置为未定义,它会导致模块被全局加载并且可以被您的脚本访问。

【讨论】:

  • 这真是太棒了!非常感谢!如果可能的话,您能否添加更多上下文?我不知道 requireJS 是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2021-11-11
相关资源
最近更新 更多