在Internet Explorer中定义的XmlHttpRequest在哪里?

时间:2015-03-05 15:33:21

标签: javascript ajax internet-explorer

我正在尝试编写一个IE BHO(从Chrome移植),我需要在XQuery中使用XSS。我希望通过替换jQuery函数$ .ajaxSettings.xhr,我可以为我自己的插件/ JavaScript启用XSS,

$.ajaxSettings.xhr = function() { return window.myExtension.Xhr() }

myExtension.Xhr是我的扩展程序中定义的COM函数(myExtension是通过((IExpando)window).addProperty)添加的。

我尝试将我的Xhr()函数定义为(C#实现COM),

public object Xhr()
{
    return new MSXML.XMLHTTPRequest();
}

但是当jQuery尝试设置XHR的onload属性时(jquery-2.1.3.js:8617),这会失败。所以看起来我使用了错误的COM XmlHttpRequest(MSXML2.XMLHttp也缺少onload)。 那么“真正的”XmlHttpRequest定义在哪里

// Listen to events
xhr.onload = callback();
xhr.onerror = callback("error");

// Create the abort callback
callback = xhrCallbacks[ id ] = callback("abort");

我当然可以使用.NET中提交GET / POST请求的几种方法之一,但是当我做XSS ajax调用时,我必须使用IE的变通方法弄脏我的代码(因为Firefox和Chrome扩展可以使用适当的权限执行XSS。)

1 个答案:

答案 0 :(得分:0)

我没有找到真正的解决方案来解决我的问题,但是我最终想要做的一种解决方法是使用jQuery 1.x,它能够(并且确实适用于IE6-8)使用旧的MSXML.XMLHTTPRequest。

我发布这个帖子给任何想在他们通过BHO注入的脚本中运行跨域Ajax请求的人。

首先,定义此界面:

[ComVisible(true)]
[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IExtension
{
    [DispId(1)]
    object Xhr();

    [DispId(2)]
    string OptionalFooBar();
}

并在某处实施,例如在这种情况下,我的BHO本身:

    //Exposed to JS
    public object Xhr()
    {
        return new MSXML2.XMLHTTP();
    }

一旦你的文档完成,比如在OnDocumentComplete处理程序中,通过IDispatchEx向窗口添加一个属性来公开你的方法:

    void OnDocumentComplete(object pDisp, ref object URL)
    {
        dynamic window = null;
        IExpando windowEx = null;
        try
        {
            if (pDisp != this.site)
                return;

            var document2 = browser.Document as IHTMLDocument2;
            var document3 = browser.Document as IHTMLDocument3;

            window = document2.parentWindow;
            windowEx = window as IExpando;
            windowEx.AddProperty("myExtension")
            window.myExtension = this;
      }

然后在你的JS中加载jQuery之后:

jQuery.ajaxSettings.xhr = function () { return window.myExtension.Xhr(); }