応答を必要としないクロスドメインAJAX呼び出しを行いたい(単にデータを収集するため)。スクリプトタグを挿入するJSONPについては知っていますが、JSONPを返さないので、もっと良い方法があるのではないかと思います。同じ方法を使用する必要がありますか、それとも使用する必要がありますか?
4 に答える
ターゲット ドメイン (データを収集するドメイン) を管理している場合
通常の XMLHttpRequests でアクセスできるように、「外部」オリジンを許可したい場合があります。
Apache .htaccess では、次のようになります (mod_headers が必要):
Header set Access-Control-Allow-Origin *
またはPHPで:
header('Access-Control-Allow-Origin: *');
実際、IE8+ では、クロスドメイン XmlHttpRequests は特別な独自のインターフェイス (XDomainRequest) を使用し、その jQuery (最後に確認したとき) は正規化されません。したがって、 jQuery を XSS Ajax で動作させるには、カスタムAjax トランスポートを実装する必要があります。それは次のようになります。
if (window.XDomainRequest) {
$.ajaxTransport(function (options, originalOptions, jqXHR) {
var xdr;
if (window.location.host != options.url.match(/:\/\/(.[^\/]+)/)[1]) {
return {
send: function (headers, completeCallback) {
xdr = new XDomainRequest();
xdr.onload = function () {
var responses = {
text: xdr.responseText
};
completeCallback(200, 'success', responses);
};
xdr.onerror = xdr.ontimeout = function () {
var responses = {
text: xdr.responseText
};
completeCallback(400, 'failed', responses);
};
xdr.open(options.type, options.url);
xdr.send(options.data);
},
abort: function () {
if (xdr) {
xdr.abort();
}
}
};
}
});
}
(私は実際にこれを本番環境で使用していますが、動作するはずです)
ターゲット ドメインを管理していない場合
リソース (画像、ページ、スクリプトなど) を要求するものは何でも実行します。
スクリプトはレンダリングされないため、おそらく「最も軽い」オプションです (したがって、スクリプトを非表示にするためのスタイリングは必要なく、いずれの場合もリフローを引き起こしません)。
var req = document.createElement('script');
req.setAttribute('src', '//example.com/api/count?' + encodeURI('id=1&data=foo bar'));
document.body.appendChild(req);
document.body.removeChild(req);
制限事項: 呼び出しによって返されるものを制御できず、呼び出しが無効な JavaScript を返し、ページ上の他のコードの前にこのコードを実行すると、一部のブラウザーの JavaScript インタープリターが中断される可能性があります (重大度によってはこの無効なコードによって引き起こされたエラー)。
また、ターゲット ドメインを制御できず、ターゲット ドメインが信頼できない場合、悪質な JavaScript が実際にサイトに挿入され、悪質で悪質な処理が行われる可能性があることにも注意してください。汚い。
フォームを動的に作成し、フォームの target 属性を使用してその値を非表示の iframe に投稿できます。
非表示の iframe を使用して、それを対象とする非表示のフォームを作成できます。
// data is a key-value pair'd object as such:{"key":"value, "key":"value" }
window.xss = function (url, method, data) {
// function to make creating hidden form elements easier:
function hEle = function (key,value) {
var ele = document.createElement("input");
ele.type = "hidden";
ele.name = key;
ele.value = value;
return ele;
}
// create the iframe(can't remember if this has to be appended to the DOM):
var myIframe = document.createElement("iframe");
// create the form:
var myForm = document.createElement("form");
myForm.setAttribute("action", url);
myForm.setAttribute("method", method||"GET");
myForm.target = myIframe;
// loop through `data` adding hidden elements to the form:
for (var key in data) {
if(data.hasOwnProperty(key)) {
myForm.appendChild(hEle(key, data[key]));
}
}
// Once everything is setup, submit the form
myForm.submit();
}
// to use:
xss("http://siteIDonthost.com/", "POST", {"myKey" : "OHNOES, VALUE!" });
いくつかのメモ:
iframe をドキュメントに追加する必要があるかどうかを思い出せません。
私がしたようにiframeをターゲットにできるかどうか思い出せません(IDなどはありません)
私が知っている唯一の代替手段は、それがオプションである場合、サーバーにクエリを実行させることです。言い換えれば、リクエストを実行する Web サーバー上である種のサービスを提供します...特に、戻りデータを解析する必要がないため、これはかなり簡単です。たとえばfile()
、PHP で単純な呼び出しを使用できます。