无法通过脚本注入在某些网站上执行Javascript

无法通过脚本注入在某些网站上执行Javascript,javascript,html,javascript-injection,Javascript,Html,Javascript Injection,我试图在页面加载后将React脚本注入网站/ 我可以在大多数网站上使用它,比如,,, 但是,当我在或中执行相同的脚本时,我在使用Babel.transform转换JSX时遇到一个参考错误,因为Babel未定义 但是,所有必需的脚本都会下载,如网络选项卡和DOM中所示 有没有人能告诉我HTML中是否有任何特定的标记或属性阻止在这些网站上执行Javascript。银行网站这样做似乎是为了防止外部Javascript 下面是我在开发人员控制台上尝试的代码 注意:你好,世界!由于设置超时5秒后出现 co

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

我可以在大多数网站上使用它,比如

但是,当我在中执行相同的脚本时,我在使用
Babel.transform
转换JSX时遇到一个参考错误,因为
Babel
未定义

但是,所有必需的脚本都会下载,如网络选项卡和DOM中所示

有没有人能告诉我HTML中是否有任何特定的标记或属性阻止在这些网站上执行Javascript。银行网站这样做似乎是为了防止外部Javascript

下面是我在开发人员控制台上尝试的代码

注意:你好,世界!由于设置超时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)
const react=document.createElement(“脚本”);
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(“脚本”);
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(“脚本”);
babel.src=”https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"
文件.正文.附件(巴别塔);
const rootDiv=document.createElement(“div”);
rootDiv.id=“app”;
rootDiv.style=“宽度:100px;高度:100px;位置:绝对;顶部:0px;左侧:0px;z索引:999999”;
document.body.appendChild(rootDiv);
设置超时(()=>{
const babelScript=document.createElement(“脚本”);
babelScript.type=“text/babel”;
const jsxCode=“ReactDOM.render(Hello,world!,document.getElementById('app'))
const babelttransfermcode=Babel.transform(jsxCode,{presets:[“react”]});
eval(babelttransformcode);
}, 5000)

这两个不工作的站点使用的是requireJs,因此它们不是在窗口上加载模块,而是使用
定义来加载

简单的做法是,在脚本的其余部分之前调用
define=undefined
,它将与其他站点一样工作。为安全起见,UMD加载程序似乎也会检查导出和modules.exports,因此您可能还希望将它们设置为未定义

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

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

您应该为正在注入的脚本处理
onload
事件,而不是任意超时。同意,但我只是想测试一下,看看有什么不同。那可能就是不同。我并不是为了开怀大笑才提出这个建议的:你的意思是脚本需要时间来加载?我不这么认为,我尝试了25秒的超时,仍然没有骰子,我可以看到脚本正在从网络选项卡加载。使用
fetch
也不起作用。这是一个建议,您可能是对的,它不会修复它。事实上,我并不太在意如何帮助你们将脚本注入银行网站。我很高兴有这样一个日志,以防需要它作为证据:)这真是太棒了!谢谢!如果可能的话,你能再加一点背景吗?我不知道requireJS是怎么工作的。