• 获取元数据和隔离策略


    了解有关获取元数据标头的所有信息,以及如何实施隔离策略来防御各种客户端攻击。

    什么是获取元数据标头?

    获取元数据标头是一种相对较新的浏览器安全功能,您可以在 Web 应用程序中使用它来防止前所未有的客户端攻击。

    标题的目的很简单。它们告诉 Web 服务器发生 HTTP 请求的上下文。

    一个例子

    这是吉姆。b.example他使用 cookie登录SessionId=123

     假设有一个网站a.exampleb.example.

     

    不获取元数据标头

    在获取元数据标头存在之前,当 Jim 打开时,Web 服务器所看到的a.example只是有人使用 Jim 的 cookie 加载了图像。

     

    在 HTTP 级别上,它可能如下所示:

    1. GET /cat.jpg HTTP/1.1
    2. Host: b.example
    3. Cookie: SessionId=123

    请注意,服务器无法知道是否a.example使用b.exampleJim 的会话 ID 加载图像。

    使用获取元数据标头

    在支持获取元数据标头的情况下,浏览器将在请求中向 Web 服务器发送更多信息。

     

    在 HTTP 级别上,它可能如下所示:

    1. GET /cat.jpg HTTP/1.1
    2. Host: b.example
    3. Cookie: SessionId=123
    4. Sec-Fetch-Dest: image
    5. Sec-Fetch-Mode: no-cors
    6. Sec-Fetch-Site: cross-site

    注意这次浏览器如何告诉网络服务器三个新的东西:

    1. 该请求源自图像元素。
    2. 请求的模式(这是一种资源负载,而不是例如导航)。
    3. 该请求来自另一个网站。

    实际上,请求中还暗示了第四件事。缺少Sec-Fetch-User标头意味着请求不是由于用户交互而产生的。

    获取元数据标头可以防止哪些攻击?

    获取元数据标头可以帮助防止几乎任何跨站点攻击。这些包括:

    获取元数据标头

    该系统由四个 HTTP 请求标头组成。

    Sec-Fetch-Site

    Sec-Fetch-Site头告诉网络服务器请求是来自同一来源、同一站点还是完全不同的网站。它可以具有以下值之一:

    • same-origin:请求来自同一个origin,即hostportscheme相同。你可以在这里阅读更多关于起源的含义。
    • same-site: 请求来自不同的来源,但来自同一站点,这是同一可注册域的子域的浏览器术语。例如:https://a.example.com并且https://b.example.com被认为是同一站点(但来源不同)。
    • cross-site: 请求完全来自不同的网站。例如,www.google.com并且www.facebook.com被认为是跨站点的。
    • none: 请求并非来自任何网站。当用户打开书签、在 URL 栏中手动键入、打开另一个程序的链接等时,就会发生这种情况。

    秒取模式

    Sec-Fetch-Mode告诉网络服务器请求的模式。它可以具有以下值之一:

    • same-origin:浏览器正在向同一来源发出请求。如果目标来自不同的来源,使用此模式的请求将失败。
    • no-cors:浏览器正在向另一个来源发出请求,但不希望读取响应或使用任何未列入安全列表的 HTTP 动词或标头。
    • cors:浏览器尝试发出 CORS(跨域资源共享)请求。您可以在此处阅读有关 CORS的更多信息。
    • navigate:浏览器正在从一个页面导航到另一个页面,例如单击链接、接收重定向或打开书签时。

    Sec-Fetch-Dest

    告诉网络服务器请求的Sec-Fetch-Dest目的地,即在什么地方等待资源。在上面的例子中,它是一个加载资源的元素,所以目的地是image.

    一些可能的值是:

    • empty: 当资源通过fetch()或 XHR 加载时。
    • document:当资源在顶级导航中加载时。
    • image: 当资源被加载到标签中时。
    • worker: 当资源通过new Worker(...).
    • iframe: 当资源加载到