Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

invalid csrf token #1475

Closed
newcomein opened this issue Sep 28, 2017 · 7 comments
Closed

invalid csrf token #1475

newcomein opened this issue Sep 28, 2017 · 7 comments

Comments

@newcomein
Copy link

newcomein commented Sep 28, 2017

您好,情况是这样的.

相关的插件配置如下=>
//jsonp配置
config.jsonp = {
    limit: 100,
    callback: ['_callback', 'callback'],
    csrf: true,
    whiteList: ['.', '.com', '.cn'],
};

config.session = {
    key: 'EGG_SESS',//键名
    maxAge: 8640 * 3600 * 1000, // 有效期
    httpOnly: true,//是否允许前端访问
    signed: true,//签名
    encrypt: true,//加密
};

//安全配置
config.security = {
    xframe: {
        enable: true,
    },
    csrf: {
        useSession: true, // 默认为 false,当设置为 true 时,将会把 csrf token 保存到 Session 中
        ignoreJSON: true, // 默认为 false,当设置为 true 时,将会放过所有 content-type 为 `application/json` 的请求
        queryName: '_csrf', // 通过 query 传递 CSRF token 的默认字段为 _csrf
        bodyName: '_csrf', // 通过 body 传递 CSRF token 的默认字段为 _csrf
        headerName: 'x-csrf-token', // 通过 header 传递 CSRF token 的默认字段为 x-csrf-token
        cookieName: 'csrfToken', // Cookie 中的字段名,默认为 csrfToken
        sessionName: 'csrfToken', // Session 中的字段名,默认为 csrfToken
    },
    domainWhiteList: [],
};

因为不是把前端放在服务端渲染,所以文档当中的 _csrf={{ ctx.csrf }} 是没办法使用,
在完全前后端分离项目中,前端通过/post接口提交数据,出现 "invalid csrf token" 文档没有相关处理案例.

前端代码:

    <form action="http://127.0.0.1:7001/post" method="post" enctype="multipart/form-data">
    <input type="file" name="files">
    <button type="submit">提交</button>
    </form>

@newcomein
Copy link
Author

额 这个提交是完全html的 没有js

@atian25
Copy link
Member

atian25 commented Sep 29, 2017

form 里面加一个 <input type="hidden" name="_csrf" value="{{ctx.csrf}}" />

或者使用 egg-security 提供的 app.injectCsrf(html)

我们在 egg-view-nunjucksFileLoader 里面有自动注入了,如果你是自己的 html 的话,就需要手动加

@atian25
Copy link
Member

atian25 commented Sep 29, 2017

如果是完全的前后端分离,前端模板不归 egg 管,是两个域名的话,那就不是 csrf 的范畴了,应该用 egg-cors

可以看下 csrf 的文档:https://eggjs.org/zh-cn/core/security.html#安全威胁-csrf-的防范

@atian25 atian25 closed this as completed Sep 29, 2017
@newcomein
Copy link
Author

"那就不是 csrf 的范畴了 " 这是不是指 cors下 csrf没有必要?

@jtyjty99999
Copy link
Member

jtyjty99999 commented Sep 29, 2017

cors情况下会做origin判断,不需要走csrf逻辑,csrf需要前后端配合的

@newcomein
Copy link
Author

感谢Thanks♪(・ω・)ノ

@roc2539
Copy link

roc2539 commented Apr 26, 2018

@jtyjty99999 cors配置了。还是会走csrf的,会返回"message": "missing csrf token"
这是需要设置什么吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants