如何禁用表单数据的缓存?

信息安全 验证 网页浏览器
2021-08-23 22:38:10

网页接受 HTTP POST 请求中的用户名和密码数据。这个 POST 请求实际上显示为浏览器历史记录中的一个条目。用户从应用程序注销并使用后退按钮“导航”回此条目后,浏览器注意到内容已过期,因此它会提示内容已过期的信息并要求重新提交请求以获取“更新”版本来自服务器的那个页面。

一旦用户单击重试/刷新按钮,则此表单数据将传递回服务器并视为正常登录请求。从而允许用户使用先前已注销用户的缓存凭据登录到应用程序。防止输入请求数据缓存的可能方法是什么?

1个回答

那不应该发生。
如果没有任何我可以查看的代码示例,我可以设想发生这种情况的一个原因是身份验证工作流程,如下所示:

在下图中,/loginPOST 到/member进行身份验证检查的地方。

如果身份验证通过,页面将继续发送“登录用户”内容。这使得该页面 ( /member) 出现在浏览器历史记录中。每当您单击浏览器上的后退/前进按钮进入此页面时,它会询问您是否要在此页面上发布表单内容。在这种情况下,日期是登录凭据。


  错误道:

  +----------------------------+ +-------- ----------+
  | 登录页面 (/login) | | 会员页面(/member) |
  |---------------------------------------| |------------------------------------------|
  | +--------------+ | | 如果信用错误|
  | 用户名 | | | | 重定向到/登录 |
  | +--------------+ |+-------->| 否则 |
  | +--------------+ | | “欢迎回来,|
  | 密码 | | | | 这是你的超级秘密|
  | +--------------+ | | 会员区在哪里可以|
  | | | 看看很酷的东西” |
  +----------------------------+ | 结束 |
                                         +------------------------------+

相反,您应该有这种身份验证流程:

  • 登录页面发布到/verify(或/auth无论你怎么称呼它)页面。
  • 验证页面没有任何 http 输出。根据信用是好是坏,它只是重定向到适当的页面。如果登录良好,它会设置一个 cookie 标志,指示有效会话。
  • 会员页面通过检查 cookie 值来验证会话,/login如果会话过期/未设置,则重定向到页面。

在此工作流程中,/verify页面永远不会出现在浏览器历史记录中,并且用户无法在该页面上“单击刷新”来触发再次发送 POST 数据。

   正确的方式发布+------------------------------+
                            +------------>| 验证页面 (/verify) |
                            | |------------------------------------------|
  +-------------------------+-+ | 如果信用错误|
  | 登录页面 (/login) |<---+---------+redirect_to /login |
  |---------------------------------------| | | 否则 |
  | +--------------+ | | | 设置会话cookie |
  | 用户名 | | | | +-------+redirect_to /成员 |
  | +--------------+ | | | | 结束 |
  | +--------------+ | | | | |
  | 密码 | | | | | +------------------------------+
  | +--------------+ | | |
  | | | | +------------------------------+
  +----------------------------+ | +----->| 会员页面(/member) |
                                   | |------------------------------------------|
                                   | | 如果 session_cookie 没有设置 |
                                   +-----------+redirect_to /登录 |
                                            | 否则 |
                                            | “欢迎回来,|
                                            | 这是你的超级秘密|
                                            | 会员区在哪里可以|
                                            | 看看很酷的东西” |
                                            | 结束 |
                                            +------------------------------+

这是常见的 Post/Redirect/Get 模型。您可以查看此 wiki 页面以获取更漂亮的图片:http ://en.wikipedia.org/wiki/Post/Redirect/Get

此外,如果您想阻止浏览器缓存某些 HTML 页面,您可以将这些页面的缓存控制 HTTP 标头设置为“无缓存”。

缓存控制:无缓存