Webbrowser Controlでクロスドメインリクエストを実行する方法
-
03-07-2019 - |
質問
ご存知のとおり、Internet Explorerでのセキュリティ上の理由から、クロスドメインXMLHTTPリクエストの実行は許可されていません。
WebBrowserコントロールがあり、URLへの Navigate
の代わりに DocumentText
を使用しています。現在のドメインは about:blank
であるため、ページがそれ自体または他のドメインにリクエストを行おうとすると、 Access is denied
Javascriptエラーが発生します。
Navigate
を使用しても、Javascriptが別のドメインにリクエストを行っても機能しません。
これを回避するにはどうすればよいですか
このHTMLコードはWebBrowserコントロールで動作するはずです:
<body>
<a href="javascript:getit('http://www.google.com')">this should work</a>
<div id="x"></div>
</body>
<script>
function XHConn()
{
var xmlhttp, bComplete = false;
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { try { xmlhttp = new XMLHttpRequest(); }
catch (e) { xmlhttp = false; }}}
if (!xmlhttp) return null;
this.connect = function(sURL, sMethod, sVars, fnDone)
{
if (!xmlhttp) return false;
bComplete = false;
sMethod = sMethod.toUpperCase();
try {
if (sMethod == "GET")
{
xmlhttp.open(sMethod, sURL+"?"+sVars, true);
sVars = "";
}
else
{
xmlhttp.open(sMethod, sURL, true);
xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
xmlhttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && !bComplete)
{
bComplete = true;
fnDone(xmlhttp);
}};
xmlhttp.send(sVars);
}
catch(z) { return false; }
return true;
};
return this;
}
function getit(url){
var xmlhttp = new XHConn();
var fnWhenDone = function (oXML) { document.getElementById('x').innerHTML = oXML.responseText; alert(oXML.responseText); };
xmlhttp.connect(url, "GET", "", fnWhenDone);
}
</script>
- Javascript / HTMLコードを制御できません。アプリケーションはWebbrowser Controlのみをホストします
- CROSS_DOMAIN_DATA URLアクションと呼ばれるものを見つけましたフラグ、正しい方向かどうかはわかりません。実装方法がわからない場合でも。
- また、この質問に回答できる場合: WebBrowserコントロールで現在のdocument.domainを設定して&#8220;アクセスが拒否されることを回避する方法&#8221 ;? で十分です。
解決
ダーティな回避策を見つけ、ローカルHTML(c:\ temp \ temp.html)をロードしてから、javascriptを介してその内容を変更します。
この時点以降、CrossDomainの制限はなくなりましたが、document.writeを使用すると、JQuery .ready
関数などの他の厄介な問題が発生します。
他のヒント
これを確認してください、それは私にとって魅力のように働きました。 http://support.microsoft.com/default.aspx? scid = kb; en-us; 246227
どのドメインでJavascriptにアクセスできないのかわかりません... script タグを使用して、別のドメインから必要なデータを取得しようとしましたか? JSONP イディオムを使用して、データの名前空間を設定できます...
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "anotherdomain.com/data?callback=myFunction";
head.appendChild(script);
そして&quot; / data&quot;で:
myFunction({
// data here
});
URLACTION-CROSS-DOMAIN-DATAは正しい方向のようです: これを読んで理由を確認してください
これを行う唯一の方法は、コードが信頼されたゾーン(またはHTAなどのより高い)で実行されることを確認することです。既定では、WebBrowserコントロール内で実行されているものはすべて、提供されるファイルが由来するゾーンで実行されます。 (つまり、標準のIEセキュリティポリシーが使用されています。)
この動作を変更するには、WebBrowserコントロールをホストしているアプリケーションを変更し、そのWebBrowserコントロールにいくつかのインターフェイスを実装する必要があります。 (IInternetHostSecurityManager、IInternetZoneManager、およびIInternetSecurityMgrSiteを確認する必要があります。)これは簡単な作業ではなく、これに関するドキュメントはほとんどありません。
これが完了すると、必要な特権でコードを実行でき、クロスドメインリクエストはMime-Sweeperのハイスコアをリセットするのと同じくらい簡単です。
これがお役に立てば幸いです。