将 csrf 令牌和参数名称添加到注销链接

Posted

技术标签:

【中文标题】将 csrf 令牌和参数名称添加到注销链接【英文标题】:Add csrf token and parameterName into logout link 【发布时间】:2014-09-19 14:29:35 【问题描述】:

我在菜单中有链接:

<li><a href="<spring:url value="/logout" />">Logout</a></li>

在我在 spring-security xml 设置中设置 csrf 保护之前,它运行良好:

<http use-expressions="true">
    <csrf />
    <logout logout-url="/logout" logout-success-url="/success" />
</http>

现在,我遇到了问题,因为注销没有 csrf 并且它不起作用。只需返回未找到代码 404 的页面。如何将这些参数添加到我的注销链接中:

"$_csrf.parameterName" value="$_csrf.token"

【问题讨论】:

【参考方案1】:

启用 CSRF 后,您只能使用 POST 请求注销。为此,您需要创建一个表单(或使用 AJAX 请求)来提交您的 CSRF 令牌。

<form action="/logout" method="post">
    <input type="hidden" name="$_csrf.parameterName" value="$_csrf.token" />
    <input type="submit" value="Logout" />
</form>

或者您可以发送 AJAX 请求。

function changeHandler() 
    // request is done and issues a redirect
    if (this.readyState === 4 && this.status === 302) 
        location.refresh();
    


var r = new XMLHttpRequest();
r.open('POST', '/logout', true);
r.onreadystatechange = changeHandler;
r.setRequestHeader('$_csrf.headerName', '$_csrf.token');
r.send();

【讨论】:

你能帮我处理ajax请求吗?我更喜欢ajax方式。

以上是关于将 csrf 令牌和参数名称添加到注销链接的主要内容,如果未能解决你的问题,请参考以下文章

角度注销后无法验证 CSRF 令牌的真实性

django 使用链接或表单注销以防止 csrf 漏洞利用

根据 AJAX 请求设计注销用户。导轨 3.1

注销后的 CSRF 令牌生命周期

客户身份验证器 + form_login 选项会破坏所有 csrf 令牌

如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?