📜  cors错误角度php(1)

📅  最后修改于: 2023-12-03 14:40:13.472000             🧑  作者: Mango

CORS错误角度分析PHP

跨域资源共享(Cross-Origin Resource Sharing, CORS)是一种Web浏览器的机制,主要用于跨域访问请求,如何使用PHP解决跨越问题是当前PHP开发中必须熟知的问题。

什么是CORS?

在网页浏览器默认情况下,JavaScript 作为一种脚本语言“同源策略”限制下运行,因安全原因防止脚本非法篡改同源站内的资源。同源策略限制了一个文档或脚本只能从同源中加载文档或执行代码。

CORS 是是一种跨域资源请求的标准。通过添加一个标准的 HTTP 头来告诉浏览器那些跨域的资源是被信任的。

CORS产生的原因

CORS 的产生是在互联网技术业界的标准、规范组织中,如WHATWG、W3C,在遵守现有机制基础上的新需求和新哲学结果。

如银行利用 Web 技术提供服务时,介于安全性的考虑,银行内部域名和所提供服务的 Web 域名可以不同,但浏览器的同源策略会限制 JavaScript 跨越这两个域名资源。CORS 支持让浏览器跨过同源策略,携带其他域名下的服务。

如何在PHP中使用CORS?

在 PHP 中,常常需要开启 CORS,在返回请求到前端时,CORS 可以控制权限和过滤器,防止被恶意攻击或擅自跨域调用。在 PHP 中,使用 CORS 主要参考以下两个方面:

方式一:使用header头信息

在向客户端发送数据时,可以使用 header("Access-Control-Allow-Origin: *"); 发送 Access-Control-Allow-Origin 的HTTP头,以允许一切源都可以接受数据。在此例子中,PHP 将返回一个包含文本值并带有跨域标头的 JSON 字符串:

<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
// code ...
echo json_encode($response);
?>
方式二:使用 H5API函数

CORS 也支持使用 H5API 函数实现跨域。H5API 就是以 HTML5 为核心的API,常常用于移动设备或移动 web 站点开发。使用PHP带有CORS的 H5API,有两种处理跨域的方式:

  1. JSONP:比较过时,但在早期 web 技术中,服务端返回调用方法名和将要返回的数据,客户端使用 script 标签发送 get 请求时,方法自动调用成功。
<?php
header('Content-Type: application/json;charset=utf-8');
$data = [
    'name' => 'Lucy',
    'age' => 18,
];
$response = [
    'code' => 0,
    'message' => "Hello CORS",
    'data' => $data,
];
$json = json_encode($response);
echo $_GET['callback'].'('.$json.')';
?>
  1. Ajax:当前比较流行,通过请求头实现跨域。
<?php
header('Content-Type: application/json;charset=utf-8');
$data = [
    'name' => 'Lucy',
    'age' => 18,
];
$response = [
    'code' => 0,
    'message' => "Hello CORS",
    'data' => $data,
];
echo json_encode($response);
?>

调用时 JavaScript 代码:

$.ajax({
  url: 'http://www.example.com/test.php',
  type: 'GET',
  dataType: 'jsonp',
  jsonp: 'callback',
  success: function(response) {
    console.log(response);
  },
  error: function() {
    alert('fail');
  },
});

相比较而言,ajax 的调用方式更加普遍,也相对更加安全。

总结

以上是基于 CORS 错误角度分析 PHP 的介绍,需要知道的是 CORS 是用于解决 Web 跨域请求问题的标准,而在 PHP 中,CORS 可以通过两种方式进行控制,使用哪种方式根据场景需求而定。