Cookies 为什么同一原产地政策不是';不足以防止CSRF攻击?

Cookies 为什么同一原产地政策不是';不足以防止CSRF攻击?,cookies,jwt,cross-domain,csrf,same-origin-policy,Cookies,Jwt,Cross Domain,Csrf,Same Origin Policy,首先,我假设后端控制输入以防止XSS漏洞 在@Les Hazlewood中,解释如何在客户端保护JWT 假设所有通信均为100%TLS-无论是在通信期间还是在任何时候 登录后-通过basic使用用户名/密码进行身份验证 身份验证和在exchange中接收JWT是一个有效的用例。 这几乎就是OAuth 2的一个流程(“密码授予”) 作品 [……] 您只需设置授权标头: Authorization: Bearer <JWT value here> 授权:持票人 但是,也就是说,如果您

首先,我假设后端控制输入以防止XSS漏洞

在@Les Hazlewood中,解释如何在客户端保护JWT

假设所有通信均为100%TLS-无论是在通信期间还是在任何时候 登录后-通过basic使用用户名/密码进行身份验证 身份验证和在exchange中接收JWT是一个有效的用例。 这几乎就是OAuth 2的一个流程(“密码授予”) 作品 [……]

您只需设置授权标头:

Authorization: Bearer <JWT value here>
授权:持票人
但是,也就是说,如果您的REST客户端“不受信任”(例如。 启用JavaScript的浏览器),我甚至不会这样做:在 可通过JavaScript访问的HTTP响应-基本上是任何标头 值或响应体值-可通过 MITM XSS攻击

最好将JWT值存储在仅限http的安全cookie中 (cookie配置:setSecure(true)、setHttpOnly(true))。这保证了 浏览器将:

  • 仅通过TLS连接传输cookie,并且
  • 永远不要让cookie值对JavaScript代码可用
  • 这种方法几乎是实现最佳实践所需的一切 安全最后一件事是确保您的计算机上有CSRF保护 每个HTTP请求确保外部域启动请求 您的网站无法正常运行。

    最简单的方法是设置一个仅安全的(但不限于http) 具有随机值的cookie,例如UUID

    我不明白为什么我们需要具有随机值的cookie来确保启动对您站点的请求的外部域无法正常工作。这不是免费的同一原产地政策吗

    发件人:

    检查原始标题

    originhttp头标准是作为一种方法引入的 防御CSRF和其他跨域攻击。不像 referer,源代码将出现在发起的HTTP请求中 从HTTPS url

    如果存在原始标题,则应检查其是否存在 一致性

    我知道OWASP本身的一般建议是同步器令牌模式,但我看不出仍然存在哪些漏洞:

    • 安全httpOnly cookie中的TLS+JWT+同源策略+无XSS漏洞
    更新1: 同一来源的政策只适用于,所以一个邪恶的网站可以很容易地提出一个表单张贴请求,这将破坏我的安全。需要显式的原点标头检查。等式是:

    • 安全httpOnly cookie+源标头检查中的TLS+JWT没有XSS漏洞
    为什么同源策略不足以防止CSRF攻击

    因为同源策略只适用于读取数据,而不适用于写入数据

    您希望避免
    http://compromised.com
    通过发出这样的请求(从用户浏览器):

    合法请求如下所示:

    POST https://example.com/transfer-funds
    fromAccountId: 1
    toAccountId: 666
    csrfToken: 249f3c20-649b-44de-9866-4ed72170d985
    
    您可以通过要求外部站点无法读取的值(CSRF令牌)来实现这一点,即在HTML表单值或响应头中

    关于Origin头,较旧的浏览器不支持它,Flash有一些漏洞可以让客户端更改它。基本上你会相信Adobe在未来不会把事情搞砸……这听起来是个好主意吗

    确保每个HTTP请求都有CSRF保护

    您只需要对具有副作用的请求(如更改状态或发送消息)提供CSRF保护

    我对同一原产地政策和CORS的概念有误解,@Bergi、@Neil McGuigan和@SilverlightFox帮助我澄清了这一点

    首先,@Bergi说了些什么


    SOP不阻止发送请求。它确实会阻止页面 访问跨域请求的结果

    这是一个重要的概念。我认为浏览器不会根据SOP限制向跨域发出请求,但这仅适用于Hossain先生在优秀教程中所称的“不那么简单的请求”

    跨来源请求有两种类型:

    • 简单请求
    • “不那么简单的请求”(我刚编的一个词)
    简单请求是满足以下条件的请求:

    • HTTP方法匹配(区分大小写)以下内容之一:
      • 得到
      • 职位
    • HTTP头匹配(不区分大小写):
      • 接受
      • 接受语言
      • 内容语言
      • 最后事件ID
      • 内容类型,但仅当值为以下值之一时:
        • 应用程序/x-www-form-urlencoded
        • 多部分/表单数据
        • 文本/纯文本
    因此,内容类型为application/x-www-form-urlencoded的帖子将命中服务器(这意味着存在CSRF漏洞),但浏览器将无法访问该请求的结果。 内容类型为application/json的帖子是一个“不那么简单的请求”,因此浏览器会发出这样的prefligth请求

    选项/端点HTTP/1.1
    主持人:https://server.com
    连接:保持活动状态
    访问控制请求方式:POST
    来源:https://evilsite.com
    访问控制请求头:内容类型
    接受:*/*
    接受编码:gzip、deflate、sdch
    接受语言:es,es;q=0.8
    如果服务器响应,例如:

    访问控制允许来源:
    访问控制允许方法:获取、发布、放置
    访问控制允许标题:内容类型
    内容类型:text/html;字符集=utf-8

    浏览器根本不会发出请求,因为

    无法加载XMLHttpRequest。回应 飞行前需求
    POST https://example.com/transfer-funds
    fromAccountId: 1
    toAccountId: 666
    csrfToken: 249f3c20-649b-44de-9866-4ed72170d985