【问题标题】:IE extension - Injecting Javascript fileIE 扩展 - 注入 Javascript 文件
【发布时间】:2014-04-05 22:25:58
【问题描述】:

我正在开发一个适用于在 Internet Explorer 中打开的网站的 IE 扩展程序。它的设计方式与 chrome 扩展程序相同。我正在尝试使用 c++ 和内容脚本通过将 JS 注入当前网页来实现 chrome 扩展的背景功能。内容脚本,我试图通过 IHTMLWindow2 execScript on Document load 事件加载。现在我需要直接注入 JS 文件,我尝试了以下方法。

在项目目标内的文件夹下有 JS 文件,并尝试使用物理路径注入。

std::wstring filePath(_T("d:/xx/xxx/x/x/Content/myFile.js"));
scriptText = scriptText+ filePath + endScript;
VARIANT vrt = {0};
HRESULT hrexec = ifWnd->execScript(SysAllocString(scriptText.c_str()),L"javascript", &vrt);

scriptText 有一些 javascript 代码来创建具有 type 和 src 属性的脚本元素。 filePath 包含指向 js 文件的物理路径。[也尝试了相对路径,但没有成功]

由于混合内容问题,上述在 IE9 中无法正常工作,据我研究发现 IE9 期望从服务器而不是本地物理路径检索 js 文件。控制台向我抛出以下异常。

SEC7111: HTTPS security is compromised by file:<filepath>
SCRIPT16388: Operation aborted

我几乎不确定是否有任何关于从物理路径将 Javascript 注入当前 DOM 的方法。请帮助我。

另外让我知道是否有任何其他可能将 JS 文件从当前工作目录注入到 DOM 中。

【问题讨论】:

  • execScript 方法我知道,是来自IHTMLWindow2 接口的 COM 方法,该方法采用包含一些 JavaScript 的字符串,而不是 JavaScript 文件名。
  • mauell,我正在尝试做同样的事情,编写一个包含 javascript 的脚本。 'scriptText' 将包含 javascript 内容,例如创建一个 head 元素和创建一个 script 元素,并且我将在 'filePath' 中附加 script 元素的 src 和在 'endScript' 中的后续脚本。
  • 如果你用我的回答解决了你的问题,请告诉我。
  • 但我真正想要的是插入文件而不是直接使用脚本
  • 想要的是一回事,IE 让你做的又是另一回事。如果有一天您找到绕过安全限制的方法,请不要忘记通知我。无论如何,我不明白您为什么不按照我在回答中的解释自己阅读文件并注入它。

标签: javascript c++ internet-explorer atl ieaddon


【解决方案1】:

您不必在 DOM 中注入 SCRIPT> 标记。

如果你的js文件包含:

var strHello = "Hello";
function SayHello() { alert( strHello ); }

您可以将文件读入内存,用它构造一个BSTR 字符串,然后将该字符串传递给IHTMLWindow2::execScript

稍后,使用字符串SayHello(); 再次调用 execScript 将弹出警告框。你注入的代码还在。

【讨论】:

  • 我的脚本行扩展到 100 行 :) 我觉得在 execScript 中编写所有这些脚本行看起来不太好。所以我使用一个文件来保存脚本,然后使用
  • 将包含数百行代码的execScript 传递给BSTR 没有问题。我用超过 1K 行来做。无论如何,在内部,JS文件被读取并且它们的内容最终以类似的方式注入......试试吧,它会解决你的问题。
  • 但我真正想要的是插入文件而不是直接使用脚本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 2012-08-15
  • 2010-10-30
  • 2010-12-15
  • 2011-09-18
  • 2013-10-12
相关资源
最近更新 更多