使用POST使用CSRF Header通过javascript下载Internet Explorer触发器文件

时间:2014-01-22 22:36:07

标签: javascript internet-explorer iframe http-headers csrf

我有一个Web应用程序正常工作,直到有人在我们的服务器上实现了CSRF修复。现在,我们无法在http请求中包含特定标头的情况下调用POST请求。这打破了文件下载,需要POST请求来获取数据而不是使用GET url参数。

我有一个修复程序,使用新的X-CSRF标头执行ajax POST请求(使用post数据)。这有效,它返回正确的内容处置响应头。问题是您无法让浏览器打开“另存为”对话框或自动下载。

在chrome / firefox中,我做了一个hack,你在其中添加一个带有数据URI的虚拟Anchor标签并单击它:

Internet Explorer不喜欢数据URI或使用javascript单击此href。 我不能使用闪存作为选项,因为客户希望产品能够使用闪存。

iframe不起作用,因为您无法使用Iframe发送自定义http标头。

您可以将Jquery添加到POST到网址的表单,但不会触发“另存为”或下载浏览器交互。

是否有任何解决方案实际上适用于IE 9或10?

1 个答案:

答案 0 :(得分:0)

好的,所以这适用于IE10 http://msdn.microsoft.com/en-us/library/ie/hh779016(v=vs.85).aspx

假设您使用arraybuffer响应类型设置XHR

var xhr = new XMLHttpRequest();
xhr.open("POST", "/lamo_api", true);
xhr.responseType = "arraybuffer";
xhr.setRequestHeader('X-CSRF', getCSRFToken()); // getCSRFToken() returns a string
xhr.onload = function() {
  var blob_builder = window.MSBlobBuilder();
  builder.append(xhr.response);
  var blob = new Blob(buffer, {'type': mimeType || 'application/octet-stream'});
  window.navigator.msSaveBlob(blob, filename);
};
xhr.send(xml_post_data);

仍在寻找IE9的答案......