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(); }
我正在尝试编写一个 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(); }