【问题标题】: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!"));
    
        }
    

    【讨论】:

      猜你喜欢
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多