【问题标题】:BHO Internet Explorer plugin - script injection issuesBHO Internet Explorer 插件 - 脚本注入问题
【发布时间】:2016-01-08 11:29:22
【问题描述】:
我有一个将 javascript 注入目标页面的 BHO(IE 插件):
string inject = "<div style=\"display:none\">injected <script type=\"text/javascript\" defer=\"defer\">" + js +
"</script></div>";
body->insertAdjacentHTML(CComBSTR("afterBegin"), CComBSTR(inject.c_str()));
我可以在 IE 的开发者控制台 (F12) 中看到该脚本已正确注入到 IE9 和 IE11 上。问题是该脚本仅在 IE9 上执行。 IE11 不执行脚本。造成这种差异的原因可能是什么? IE11 是否会为了某种类型的安全改进而阻止这种情况?是否可以修改 BHO 以在 IE11 上也执行此脚本?
【问题讨论】:
标签:
javascript
internet-explorer
internet-explorer-9
internet-explorer-11
bho
【解决方案1】:
我能够让它在 IE10 和 IE11 上运行。我没有使用 insertAdjacentHTML 进行注入,而是使用了 appendChild 方法并将 HTMLScriptElement 附加到它上面。以下是我的代码摘录。
LOG(_T("Beginning script injection"));
CComPtr<IHTMLElement> htmlElement;
if (!SUCCEEDED(hr = doc->createElement(CComBSTR("script"), &htmlElement)))
{
LOG_ERROR(_T("createElement of type script failed"), hr);
return;
}
CComPtr<IHTMLScriptElement> htmlScript;
if (!SUCCEEDED(hr = htmlElement.QueryInterface<IHTMLScriptElement>(&htmlScript)))
{
LOG_ERROR(_T("QueryInterface<IHTMLScriptElement> failed"), hr);
return;
}
htmlScript->put_type(CComBSTR("text/javascript"));
htmlScript->put_text(CComBSTR(js.c_str()));
CComPtr<IHTMLDocument3> htmlDocument3;
if (!SUCCEEDED(hr = doc.QueryInterface<IHTMLDocument3>(&htmlDocument3)))
{
LOG_ERROR(_T("QueryInterface<IHTMLDocument3> failed"), hr);
return;
}
CComPtr<IHTMLElementCollection> htmlElementCollection;
if (!SUCCEEDED(hr = htmlDocument3->getElementsByTagName(CComBSTR("head"), &htmlElementCollection ) ) )
{
LOG_ERROR(_T("getElementsByTagName failed"), hr);
return;
}
CComVariant varItemIndex(0);
CComVariant varEmpty;
CComPtr<IDispatch> dispatchHeadElement;
if (!SUCCEEDED(hr = htmlElementCollection->item(varEmpty, varItemIndex, &dispatchHeadElement )) )
{
LOG_ERROR(_T("item failed"), hr);
return;
}
if (dispatchHeadElement == NULL )
{
LOG_ERROR(_T("dispatchHeadElement == NULL"), hr);
return;
}
CComQIPtr<IHTMLDOMNode, &IID_IHTMLDOMNode> spHeadNode = dispatchHeadElement; // query for DOM interfaces
CComQIPtr<IHTMLDOMNode, &IID_IHTMLDOMNode> spNodeNew = htmlScript;
if (spHeadNode)
{
if (!SUCCEEDED(hr = spHeadNode->appendChild(spNodeNew, NULL)))
{
LOG_ERROR(_T("dispatchHeadElement == NULL. Script injection failed"), hr);
return;
}
LOG(_T("Script injection SUCCESS!"));
}