我想进行跨域AJAX调用,该调用不需要响应(它只是用于收集数据)。我知道你插入脚本标签的JSONP,但因为我不会返回任何JSONP,我想也许有更好的方法。我还是需要使用相同的方法吗?
答案 0 :(得分:3)
您可能希望允许“外来”来源,因此您可以使用普通的XMLHttpRequests访问它。
在Apache .htaccess中就像(需要mod_headers):
Header set Access-Control-Allow-Origin *
或者在PHP中:
header('Access-Control-Allow-Origin: *');
实际上在IE8 +中,跨域XmlHttpRequests使用了一个特殊的专有接口(XDomainRequest),即jQuery(我最后一次检查)没有规范化。因此,您需要实现自定义 Ajax传输以使jQuery与XSS 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,并做出令人讨厌的坏事。讨厌。
答案 1 :(得分:0)
您可以动态创建表单,并使用表单的目标属性将其值发布到隐藏的iframe。
答案 2 :(得分:0)
你可以使用一个隐藏的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或者这样)
答案 3 :(得分:0)
我唯一知道的选择是让服务器为您执行查询,如果这是一个选项。换句话说,在将要执行请求的Web服务器上提供某种服务...特别是因为您不需要解析任何返回数据,这将是相当简单的。例如,您可以在PHP中使用简单的file()
调用: