[英]Where's XmlHttpRequest defined in 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)
添加((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進行XSS適當的權限)。
我沒有找到一個真正的解決方案來解決我的問題,但是我最終想要做的一種解決方法是使用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(); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.