当前位置: 首页 > 知识库问答 >
问题:

为什么当我通过请求向后端发送令牌时,CSRF令牌总是说CSRF无效?

左丘昊天
2023-03-14

我导入了这两个包(csrf、cookieparser),并在appjs中使用了express-js,它只工作,而且我在postman中测试了它的工作情况,这里是我的代码express-js:

const csrf = require('csurf')
const cookieParser = require('cookie-parser')

const csrfProtection = csrf({
    cookie: {
        httpOnly: true,
        maxAge: 3600
    }
});

app.use(cookieParser())
app.use(csrfProtection);

app.get('/auth/csrf-token', (req, res) => {
    res.json({ csrfToken: req.csrfToken() });
});

还有我使用 react js 的前端,在 useEffect 中,我从后端获取 csrf,然后我保存在 axios 的标头中,但是当我向后端发送请求时,响应说无效的 csrf :/

   useEffect(() => {
        const getCsrfToken = async () => {
            const { data } = await API.get('/auth/csrf-token');
            API.defaults.headers.post['X-CSRF-Token'] = data.csrfToken;
        };
        getCsrfToken();
    }, []);
    
      const handelLogin = (e) => {
        e.preventDefault();
        API.post('/auth/login', {
            headers: {
                'Content-Type': 'application/json'
            },
            data: { email, password },
        }).then(({ data }) => {

            if (data.token) {
                localStorage.setItem('token', data.token);
                window.location.href = '/admin'
            }

        }).catch((e) => {
            console.log(e)
        })
    }

来自服务器的响应:ForbiddenError:无效的csrf令牌;

共有2个答案

柴意智
2023-03-14

我通过在更改后将凭据添加到axios所有代码来解决问题

 AXIOS.get('get/csrf-token', {
            headers: {
                Accept: "application/json",
                "Content-Type": "application/json",
            },
            withCredentials: true
        }).then(({ data }) => {
            AXIOS.defaults.headers.common['x-csrf-token'] = data.csrfToken
            AXIOS.defaults.withCredentials = true
        })
鲜于浩淼
2023-03-14

正如https://expressjs.com/en/resources/middleware/csurf.html#using-ajax中提到的

尝试将标头属性更改为此,

API.defaults.headers.post['CSRF-Token'] = data.csrfToken;
 类似资料:
  • 概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and

  • 我想从Stormpath帖子中对JWT令牌和CSRF提出疑问,这些令牌和CSRF解释了将JWT存储在localStorage或Cookie中的优缺点。 [...] 如果您使用JS从cookie中读取值,这意味着您不能在cookie上设置Httponly标志,因此现在站点上的任何JS都可以读取它,从而使其与在localStorage中存储内容的安全级别完全相同。 我试图理解为什么他们建议将xsrfT

  • 本页描述了解释CSRF攻击的用例(16.1): https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html 但是,如果用户确实登录了银行的网站,那么邪恶的网站难道不可能发出GET请求以获取新的CSRF令牌,并在根本不需要用户的情况下撰写帖子吗? 答案必须是否定的,否则CSRF令牌将毫无用处,但我

  • 我遇到了CodeIgniter/CSRF/JSON的问题。 我正在向PHP后端发送内容类型为“application/json”的http POST请求。有效负载是json数据。我将与数据一起传递生成并存储在CSRF cookie中的CSRF令牌。对于标准POST表单请求,它工作正常,但作为json发送时失败。 由于$\u POST数组因JSON内容类型而为空,CodeIgniter无法验证coo

  • 问题内容: 我用, Spring Framework 4.0.0发布(GA) Spring Security 3.2.0发布(GA) Struts 2.3.16 在其中,我使用内置的安全令牌来防御CSRF攻击。 Struts表单如下所示。 生成的HTML代码如下。 除非请求是多部分的,否则在此情况下,请求以状态码403结束,这可以很好地工作。 HTTP状态 403-在请求参数标头’X-CSRF-T

  • null 其中,我使用内置的安全令牌来防范CSRF攻击。 Struts表单如下所示。 生成的HTML代码如下所示。 文件如下所示。 那么,当请求是多部分的时候,在哪里寻找这个令牌呢?(这应该与Struts无关。) 的实现可以在前面的问题中找到,如果需要的话。