在前端注销时如何撤销浏览器中的 Http-only cookie?

问题描述 投票:0回答:2

在前端注销时如何撤销浏览器中的 Http-only cookie?

情况:

  1. 我在服务器上为登录用户设置了身份验证 cookie。
  2. 将cookie标记为Http-only以防止XSS攻击。
  3. cookie 设置 3 个月有效期,以防止每次都输入凭据。
  4. 有时,当用户单击注销按钮时,网络由于某种未知原因无法工作,因此浏览器会在用户注销后保留该 cookie。
  5. 为了防止这种情况发生,我必须在用户单击注销按钮后强制浏览器撤销 cookie。
  6. 但是 wiki 告诉我,我没有更改仅 Http cookie 的权限。

那么,如何撤销 Http-only cookie?
或者,我是否遗漏了服务器上的会话配置中的某些内容?

javascript node.js cookies session-cookies
2个回答
1
投票

有一个解决方法:

每当用户单击注销按钮时,都会为网站的域设置一个新的、单独命名的 cookie,该 cookie 向 Web 服务器指示用户的仅 HTTP cookie 应在下一次成功的 HTTP 请求时立即过期(例如

expire-my-session-cookie
) 。最后,在服务器中,添加一个中间件、请求拦截器或 HTTP 模块(我不知道你正在使用什么服务器端平台)来检查这个
expire-my-session-cookie
),如果存在,则重定向或重写请求到真正的注销处理程序以完成使任何仅 HTTP cookie 过期的任务。

我认为这里不存在任何安全风险,就好像您的网站确实存在脚本注入漏洞一样,恶意脚本可以通过设置

window.location = 'http://your/logoff/page'
来单方面注销您的用户。

渲染的 HTML 中类似这样的内容:

<a href="/logoff" onclick="document.cookie = 'expire-my-session-cookie=true'; return true;">logoff</a>

像这样的 HTTP 中间件(即在每个请求上执行,静态文件和资产除外):

(伪代码)

function( next ) {

    if( request.cookies["expire-my-session-cookie"] == "true" ) {

        // Set all of the user's cookies to expire immediately:
        for( int i = 0; i < request.cookies.length; i++ ) {

            response.cookies.setCookie( request.cookies[i].name, "", expires: 1970-01-01 );
        }

        return response.redirect( 'logoff-handler' );
    }
    else {

        // Otherwise continue as normal:
        return next();
    }

0
投票

我现在有完全相同的情况,但是“注销”不需要在前面进行更改,服务器将会话标记为已完成,您无法使用此cookie去任何地方。一般来说,除了每个请求中放置“credentials: 'include'”之外,前面没有什么需要更改的,所有逻辑都完全存储在服务器上。

© www.soinside.com 2019 - 2024. All rights reserved.