zoukankan      html  css  js  c++  java
  • CSRF

    更新: 2021-07-01

    refer: https://stackoverflow.com/questions/40523565/asp-net-core-x-frame-options-strange-behavior

    services.AddAntiforgery 就是防 csrf 的, 

    随着我们调用下面其中一个它就会被启动了, 所以大部分情况不需要手动开启的. 

    它里面还有保护 clickJacking 哦, 不过它是只有在有 set cookie 的情况下才会保护的 (也就是当有做 anti foreign token 出来的时候, anti foreign token 是存在 cookie 的呀)

    所以如果我们不想被其它网站 iframe 嵌套的话, 那不能依靠它, 还是自己 set 一个 CSP 比较稳

    更新: 2021-06-24

    容易搞不清楚的地方

    1. 如果我没有使用 cookie 还需要担心这些吗 ? 

    不需要. 它就是 hack cookie 的

    2. same site 是不是可以替代 anti foreign token 

    是, 前提是用户的游览器必须是 modern 的, IE 是不支持的

    3. ajax bearer token 是不是不需要 care 这些了. 

    是的, bearer token 就等于不使用 cookie 了

    4. get 请求为什么不可以有 side effect .

    规范. 顺风水. 比如 same site lax 的情况下, get 是带 cookie 的, 如果你把 get 做成可以有 side effect 的话, 那么 same site 就保护不了了. 所以要乖

    更新:2021-06-24

    Asp.net core razor page and web api 的 CSRF 和 anti foreign token 

    来看看 asp.net core 的机制 

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks

    https://exceptionnotfound.net/using-anti-forgery-tokens-in-asp-net-core-razor-pages/#commento-login-box-container

    razor page 默认就会检查. 

    <form method="post" > 它自己会把 anti token 放进去 input hidden, 然后 post 的时候也会检查。我们什么都不需要做. 

    最好是使用 asp- 指令不管是 asp-for, asp-page 都 ok  

    如果像下面这种情况, 没有用到 asp- 又是 action to 另一个 page, 它就不聪明了. 我们需要刻意的加入 asp-antiforgery="true", 或者写成 action="~/account/logout" 也可以,关键就是 .net 需要有个识别方式 (不要问我为什么 form 它认不出来...)

    <form method="post" action="/account/logout" asp-antiforgery="true">
        <button>Logout</button>
    </form>

    web api, ajax 的话就没有自动检查了. 

    可以学 angularjs 的做法,放入到 header 里

     然后自己检查. 也是很简单而已.

    refer : 

    https://www.jianshu.com/p/855395f9603b

    https://www.cnblogs.com/ziyunfei/p/5637945.html

    https://www.jianshu.com/p/66f77b8f1759

    CSRF 跨站请求伪造

    讲的是 cookie 被 hack 了. 

    举例 

    小明访问 bank.com 登入后有了 cookie, 然后它去访问 hacker.com 

    hacker.com 提交了一个表单给 bank.com 

    由于表单是提交给 bank.com 游览器就会附带 bank.com 的 cookie .

    bank server 会把这个请求当成一般请求看代. 然后钱就被转走了. 

    所以从前对老百姓的教育就是,你上银行网站后不要乱乱逛其它地方,做好事情就登出.. 

    但教育不管用丫, 于是银行就想了些办法. 

    关键就是要确保请求时 bank.com 发出的就好了嘛. 

    于是 bank 就做了一个随机的 token 放到 bank.com 和 cookie 里头.

    当 bank.com 提交表单的时候会附带这个 token, 只要和 cookie 里的 token 匹配一下就可以了. 

    hacker.com 无法读取 cookie 因为域不同, 也就无法知道 token, 匹配不到 token bank 就拒绝执行了 

    时至今日, 虽然上述方法还是用于大部分的项目中,但是游览器厂商也给出了一个更好的方法. 

    那就是在 cookie 设置 same-site 

    它有 2 个值 Strict 和 Lax

    Strict 是严格模式, 只要不同域就不发 cookie, 包括跳转 和 get 请求, 但这个不是很好用,比如 a 网站点击链接去到了 b 网站, 结果 b 网站的 cookie 没有效果.

    所以大部分时候用 Lax,Lax 不会限制安全请求, 比如 get 的时候依然会带上 cookie 的. 

    最后说一下, get 请求和 CSRF.

    可能我们会想, get hacker.com 如果发一个 get 请求去查看我银行的余额可以嘛? 

    其实是不可以的, 游览器会有 cross domain 防御. 虽然请求依然会被 server 处理, 但是游览器接收后并不会运行后续的 js.

    所以是安全的。 

    CSRF 的攻击手法只限于游览器, 就是说我做了一个 hack.com 然后骗你进来, 然后再 hack.com 里面发请求去 bank.com. 

  • 相关阅读:
    java 多线程学习(一)
    解决安卓微信浏览器刷新问题
    sublime text3 配置tab为4个空格
    React 错误Each child in an array or iterator should have a unique “key” prop
    git filename to long问题解决
    JS获取URL参数 方法
    CSS超出2行省略号
    JS判断是否为安卓orIOS
    获取移动设备真实宽高
    微信分享朋友圈监听(PHP)
  • 原文地址:https://www.cnblogs.com/keatkeat/p/10779711.html
Copyright © 2011-2022 走看看