当前位置: 首页 > 网络应用技术

安全系列:跨域资源共享CORS

时间:2023-03-08 21:21:57 网络应用技术

  什么是交叉域资源共享?我们知道一个域由三个部分组成:方案,域和端口。这三个部分只能标记域或服务器请求。Cross -domain资源共享意味着服务器允许其他域访问其自身域的资源。

  CORS是基于HTTP头标头检测的机制。本文将详细解释。

  出于安全原因,域发起的请求只能获得域的自己的资源,因为域内资源内部的互操作性被认为是安全的。

  但是,随着现代浏览器技术和Ajax技术的开发,从JavaScript索取其他域资源的需求逐渐出现。我们将此需求称为交叉域请求。

  例如

  那么客户如何知道服务器是否支持CORS?

  在这里,您将使用称为Preflicht的请求。此请求仅是为了确认服务器以支持访问资源的交叉域请求。当客户端做出响应时,它将真正请求服务器中的交叉域资源。

  尽管客户端要为CORS请求设置HTTP请求,但服务器还需要进行一些设置以确保客户端的请求可以响应客户端。因此,本文也适用于前端开发人员和背面 -结束开发人员。

  是的,如果任何请求要标准化,则必须制定标准协议。CORS也是如此。CORS协议主要定义http.LET中的请求头和响应头。

  第一个是HTTP的请求标题。请求头是客户端请求资源带来的数据。CORS请求标头包含三个部分。

  第一部分是Origin,该部分指示启动交叉域资源请求的请求或前飞行请求源:

  Origin仅包含服务器名称信息,不包括任何路径信息。

  请注意,原点的值可能为null

  第二部分是访问控制 - 重试方法。这是一个Preflicht请求。告诉服务器到下一次真正使用的HTTP资源请求:

  第三部分是Access-Control-Request-Headers,这也是前飞行请求,告诉服务器在下一个真实的HTTP请求中要带有的标题数据。标题中的数据与访问控制相对应服务器上的标题。

  有了客户端的请求,需要服务器侧面响应。我们需要在服务器上设置服务器以设置HTTP标头数据。

  Access-Control-Allow-Origin代表服务器允许的CORS的域。它可以指定特定域或使用*指示所有域。

  应该注意的是,如果您请求认证信息,则不能使用*。

  让我们看看一个例子:

  上面的示例表明服务器允许www.flydean.com的请求。这是特定域的特定域,而不是使用*.bava,因为服务器可以设置允许的域列表,仅返回此处的一个域地址,因此您需要添加一个变化:ORIGIT HEANDER信息下面的ORIGHER信息下方已发送ORORIGIN信息。。

  Access-Control-Expose-Headers表示服务器允许客户或CORS资源同时访问标题信息。格式如下:

  例如:

  上面的示例将公开custom-header1,custom-header2(客户端)。客户可以获得这两个标题的价值。

  访问控制 - 最大值指示Preflicht请求的请求结果将被缓存多长时间。格式如下:

  三角洲秒为几秒钟。

  该字段用于指示服务器是否接受具有凭据字段的客户端。如果它在前飞行请求中使用,则意味着后续的实际请求是否支持凭据,其格式如下:

  该字段代表访问资源的方法,该方法主要用于前飞行请求中。格式如下:

  在飞行前请求中使用,表明可用于提出请求的标头字段如下:

  有了CORS协议的基本概念,我们可以开始使用CORS来构建跨域资源。

  让我们看一下最基本的CORS请求。例如,我们的网站是www.flydean.com。在此网站的页面中,我们希望获得https://google.com ...

  该请求是最基本的CORS请求。我们看到客户端发送的请求的数据:

  该请求与CORS有关,这表明该请求的源域是www.flydean.com。

  可能的退货结果如下:

  上面的返回结果应注意,访问控制 - 允许孔: *表示服务器允许所有Origin请求。

  上面的示例是最基本的请求,客户端直接从服务器请求资源。Next,让我们看一个预先验证的请求的示例。预拆卸请求请求分为两部分。第一部分是请求判决,第二部分是真实的请求。

  请注意,GET请求不会发送预闪烁。

  您何时会发送预覆盖的请求?

  出于安全原因,当客户端将选项方法发送到服务器时,因为服务器不一定接受这些选项的方法,客户端需要先发送预先验证的请求,等待服务器响应,等待服务器到达服务器确认,然后发送真实的内容发送真实的示例。

  在上面的示例中,我们向服务器发送了一个帖子请求。在此请求中,我们添加了一个自定义标题:Cust-Head.b,因为此标头不是HTTP1.1中的标准标头,因此您需要先发送预易换请求。

  该请求添加了两个字段的访问 - 重新控制 - 重新测试 - amthod和access-control-requreq-headers。

  获得的服务器响应如下:

  该响应返回了访问控制,允许孔,访问控制 - 允许使用方法和访问控制者 - 允许头。

  客户端收到服务器的响应后,您可以继续发送带有以下内容的真实请求-UP请求:

  在实际请求中,我们不需要发送访问控制*标题,只需发送真实的请求数据即可。

  最后,我们从服务器中得到响应:

  有时,我们需要访问认证信息所需的资源。这些认证信息由HTTP Cookie传输,但是对于浏览器,它不会默认情况下进行认证。如果您想认证,则必须设置一个特定的标记:

  在上面的示例中,我们设置了带有Credentials标志的设置,表明这是带有认证的请求。

  相应的请求如下:

  在请求中,我们带来了cookie,服务器的相应响应如下:

  服务器返回访问控制:true,表明服务器接收凭据认证并返回set-cookie选项以更新客户端的cookie。

  应当指出的是,如果服务器支持凭据,则不能*访问控制的值,访问控制 - 允许孔,访问控制者和访问控制的值无法*。

  本文在HTTP协议中简要介绍了CORS协议。应该注意的是,CORS实际上是HTTP请求标头和响应标头之间的相互作用。

  最受欢迎的解释,最深的干货,最简单的教程,您不知道的许多技巧正在等待您发现!

  欢迎注意我的公共帐户:“程序的事情”,了解技术并更好地了解您!