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