javascript - 绕过 IE 文件下载安全规则的技术有哪些?

标签 javascript jquery internet-explorer

如果相应请求不是直接从用户操作(如“点击”处理程序或 native 表单提交)。可能还有更多细节和细微差别,但这是让我感到沮丧的基本行为。

在我看来,这种情况很常见:某些可下载内容(例如准备好的 PDF 报告)前面的用户界面允许在创建内容时使用某些选项和输入。现在,对于允许用户规定应用程序如何做某事的所有表单,输入可能会出错。不总是,但有时。

因此有一个两难选择。如果客户端试图做一些花哨的事情,比如运行 AJAX 事务让服务器审查表单内容,然后重新提交以获取下载,IE 不会喜欢那样。它不会喜欢它,因为携带附件的实际 HTTP 事务不会发生在原始用户操作事件处理程序中,而是发生在 AJAX 完成回调中。更糟糕的是,由于 IE 安全栏似乎认为解决所有问题的方法是简单地从其原始 URL 重新加载外部页面,因此它邀请用户继续下载可疑内容甚至都行不通。

另一种选择是让表单消失。服务器检查参数,如果有任何错误,它会使用表单容器页面进行响应,并适本地添加错误消息。如果表单内容没问题,它会生成内容并将其作为附件发送回 HTTP 响应。在这种情况下(我认为),IE 很高兴,因为内容显然是用户直接请求的(顺便说一下,这是一种区分好内容和坏内容的可笑的脆弱方式)。这很好,但现在的问题是客户端环境(也就是我页面上的代码)无法判断下载是否有效,所以表单仍然在那里。如果我的表单位于某种对话框中,那么我确实需要在操作完成后将其关闭 — 实际上,这是以 AJAX 方式进行操作的动机之一。

在我看来,唯一要做的就是为表单对话框配备消息,例如“下载开始时关闭它”。这对我来说真的很蹩脚,因为它是“请为我按下这个按钮”界面的一个例子:理想情况下,我自己的代码应该能够在适当的时候按下按钮。我不知道的一个关键问题是客户端代码是否有任何方法可以检测到表单提交导致了附件下载。我从来没有听说过有什么方法可以检测到这一点,但这会为我打破僵局。

最佳答案

我认为您正在使用不同的目标窗口提交表单;因此表格留在原地。

有几个选项。

  1. 保持提交按钮处于禁用状态,并在后台进行持续验证,轮询表单以了解字段的更改,然后在字段更改时触发验证请求。当表单处于有效状态时,启用按钮;如果不是,请禁用该按钮。这并不完美,因为往往会有延迟,但对于您正在做的事情来说可能已经足够好了。
  2. 在表单的 submit 事件的处理程序中执行不需要往返服务器的基本验证,然后提交表单并将其删除(或者可能只是隐藏它)。如果服务器上的进一步验证检测到问题,它可以返回一个页面,该页面使用 JavaScript 告诉原始窗口重新显示表单。
  3. 使用 session cookie 和唯一的表单 ID(new Date().getTime() 中的当前时间即可);提交表单时,禁用其提交按钮但保持可见直到响应返回。使响应设置一个 session cookie,其中包含指示成功/失败的 ID。让包含表单的窗口每隔一秒左右轮询一次 cookie,并在看到结果时采取行动。 (我从来没有做过最后一个;不是立即看看它为什么行不通。)

我预计还有十几种其他方法可以给这只猫剥皮,但我想到了这三种。

(编辑) 如果您不提交到不同的目标,您可能想继续这样做 - 到同一页面上的隐藏 iframe .这(可能与上述或其他答案相结合)可能会帮助您获得所需的用户体验。

关于javascript - 绕过 IE 文件下载安全规则的技术有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2064882/

相关文章:

javascript - JQueryUI 模型未按预期工作

javascript - Kendo UI 网格依赖性

javascript - 移动网站上的标签 - Javascript 已关闭,该怎么办?

jQuery 无法在 Firefox 和 Internet Explorer 中工作

css - 固定高度 block 中的垂直对齐图像

javascript - 同构 React 与 React Router 和 KOA

javascript - Github高危js应用安全漏洞: GHSA-7fhm-mqm4-2wp7 with a Node.

java - Selenium/Java 无法与 Windows 上的 IE 一起使用

javascript - 在 Ember 类中使用变量进行数组键命名

javascript - 我在代码中找不到我的错误。旁边的总估算未显示