网页接受 HTTP POST 请求中的用户名和密码数据。这个 POST 请求实际上显示为浏览器历史记录中的一个条目。用户从应用程序注销并使用后退按钮“导航”回此条目后,浏览器注意到内容已过期,因此它会提示内容已过期的信息并要求重新提交请求以获取“更新”版本来自服务器的那个页面。
一旦用户单击重试/刷新按钮,则此表单数据将传递回服务器并视为正常登录请求。从而允许用户使用先前已注销用户的缓存凭据登录到应用程序。防止输入请求数据缓存的可能方法是什么?
网页接受 HTTP POST 请求中的用户名和密码数据。这个 POST 请求实际上显示为浏览器历史记录中的一个条目。用户从应用程序注销并使用后退按钮“导航”回此条目后,浏览器注意到内容已过期,因此它会提示内容已过期的信息并要求重新提交请求以获取“更新”版本来自服务器的那个页面。
一旦用户单击重试/刷新按钮,则此表单数据将传递回服务器并视为正常登录请求。从而允许用户使用先前已注销用户的缓存凭据登录到应用程序。防止输入请求数据缓存的可能方法是什么?
那不应该发生。
如果没有任何我可以查看的代码示例,我可以设想发生这种情况的一个原因是身份验证工作流程,如下所示:
在下图中,/login
POST 到/member
进行身份验证检查的地方。
如果身份验证通过,页面将继续发送“登录用户”内容。这使得该页面 ( /member
) 出现在浏览器历史记录中。每当您单击浏览器上的后退/前进按钮进入此页面时,它会询问您是否要在此页面上发布表单内容。在这种情况下,日期是登录凭据。
错误道: +----------------------------+ +-------- ----------+ | 登录页面 (/login) | | 会员页面(/member) | |---------------------------------------| |------------------------------------------| | +--------------+ | | 如果信用错误| | 用户名 | | | | 重定向到/登录 | | +--------------+ |+-------->| 否则 | | +--------------+ | | “欢迎回来,| | 密码 | | | | 这是你的超级秘密| | +--------------+ | | 会员区在哪里可以| | | | 看看很酷的东西” | +----------------------------+ | 结束 | +------------------------------+
相反,您应该有这种身份验证流程:
/verify
(或/auth
无论你怎么称呼它)页面。/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 标头设置为“无缓存”。
缓存控制:无缓存