防止浏览器后退按钮/历史记录中的信息泄露?

信息安全 应用安全 Web应用程序 网页浏览器 javascript 数据泄露
2021-08-28 10:50:23

我有将托管在网站上的敏感数据,我想防止数据在这种情况下暴露:

  • 主要用户注销应用程序,但不关闭浏览器(假设 Kiosk 环境)

  • 然后,第二个(恶意)用户接近终端,然后点击后退按钮或只是浏览历史记录。

结果,恶意用户能够查看他们未经授权的内容。

  1. 我有什么方法可以防止这种情况发生?

  2. 我可以做些什么来保持网站“用户友好”并允许经过身份验证的用户返回历史记录,而不是未经身份验证/未经授权?

我正在玩的一些想法包括

  • 缓存控制:无缓存
  • 上一次更改
  • 过期
  • 还有 Javascript 来刷新页面的身份验证

但我不确定在 SSL 或非 SSL 模式下运行时,这些不同的设置将如何影响 Web 浏览器。如果涉及代理,这将变得更加复杂,因此我决定与专家联系是明智的。

4个回答
  1. 使用 SSL
  2. 确保正确实施会话管理 - 例如,在每个页面上检查是否存在正确的会话 ID,并在注销时销毁
  3. 添加缓存控制:no-cache,pragma: no-cache 和 expire: -1 headers到处
  4. 确保表单和每个敏感变量仅通过 POST 请求而不是 GET 提交(在代码审核期间,我看到无数次页面无缘无故地接受这两种方法)

如果代理改变了事情,那么你就没有使用 SSL,如果交换的数据是“敏感的”,那么不使用 SSL 是非常糟糕的。说到这一点,公共信息亭上的敏感数据可以用键盘记录器“增强”,嗯,这也不是非常令人放心。

您可以使用 Javascript 下载和显示内容页面,而无需在浏览器意义上“更改页面”。然后,您将提供自己的后退和前进“按钮”。然后,您在实际页面更改(从浏览器的角度)上添加一个钩子来删除内部内容。

如果用户打开一个新窗口并忘记关闭“敏感”窗口,上述任何方法都不会为您提供帮助。

缓存控制确实适用于 SSL 连接,并且被浏览器广泛支持,因此这似乎是最好的方法。如果您通过 SSL 连接,代理将执行中间人并提供内容,或者它会忽略它并正常路由。如果它执行 MiTM,它将破坏浏览器证书信任检查,因此会出现一个大的红色错误,并且(希望)您的用户被教导离开信息亭并使用其他东西。如果他们不这样做,那么你就是 SOL。

如果代理只是路由连接并且您传入缓存控制或过期或 Last-Modified 标头,则浏览器有望支持它。您遇到的问题是 HTML 页面的本地缓存。恶意用户可能只是从缓存中读取页面。如果浏览器不支持,不要让用户查看页面。检查用户代理并与已知支持的版本列表进行比较。

当然,正如汤姆所说,如果信息亭安装了键盘记录器,游戏就结束了。

一个古老的问题,但为现代添加了一个答案。

对于敏感响应,您应该设置以下标头:

Cache-Control: no-store, must-revalidate

这些天来,您可能不需要担心 HTTP 1.0Expires标头。Pragma仅用于请求,而不是响应。

要在会话超时后刷新页面(以便出现登录表单),请添加以下标题:

Refresh: n + m

哪里n是秒,直到会话超时数,m是一个小的延迟。在 Java 中,这是:

session.getMaxInactiveInterval() - ( System.currentTimeMillis() - session.getCreationTime() ) / 1000