XmlHttpRequest 在 Internet Explorer 中定义在哪里?

Where's XmlHttpRequest defined in Internet Explorer?

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

来为我自己的 addon/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)。 那么 "real" 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)。

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

我将此发布给任何想要 运行 跨域 Ajax 脚本请求的人,他们通过 BHO 注入脚本。

首先,定义这个接口:

[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 将 属性 添加到 window 以公开您的方法:

    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(); }