在PHP中,禁止API被跨域调用可以通过设置HTTP响应头来实现。跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,允许浏览器从不同域名的服务器请求资源。如果不希望API被跨域调用,可以通过以下方式限制。


1. 禁止所有跨域请求

通过设置Access-Control-Allow-Origin响应头为null或特定域名,可以限制跨域请求。

<?php
header('Content-Type: application/json'); // 禁止所有跨域请求
header('Access-Control-Allow-Origin: null'); // 或者只允许特定域名访问
// header('Access-Control-Allow-Origin: https://example.com'); // 示例API逻辑
echo json_encode(['message' => 'This API cannot be accessed from other domains.']);
?>

2. 完全禁用CORS

如果希望完全禁用CORS,可以设置以下响应头:

<?php
header('Content-Type: application/json'); // 禁用CORS
header('Access-Control-Allow-Origin: none');
header('Access-Control-Allow-Methods: none');
header('Access-Control-Allow-Headers: none'); // 示例API逻辑
echo json_encode(['message' => 'CORS is disabled for this API.']);
?>

3. 检查请求来源

通过检查$_SERVER['HTTP_ORIGIN'],可以动态限制允许的域名。

<?php
header('Content-Type: application/json'); // 允许的域名列表
$allowedOrigins = [
'https://example.com',
'https://sub.example.com'
]; // 获取请求来源
$origin = $_SERVER['HTTP_ORIGIN'] ?? ''; // 检查请求来源是否在允许列表中
if (in_array($origin, $allowedOrigins)) {
header("Access-Control-Allow-Origin: $origin");
} else {
http_response_code(403); // Forbidden
echo json_encode(['error' => 'Cross-origin requests are not allowed.']);
exit;
} // 示例API逻辑
echo json_encode(['message' => 'This API can only be accessed from specific domains.']);
?>

4. 限制HTTP方法

除了限制来源,还可以限制允许的HTTP方法(如只允许GET请求)。

<?php
header('Content-Type: application/json'); // 允许的HTTP方法
$allowedMethods = ['GET']; // 获取请求方法
$method = $_SERVER['REQUEST_METHOD']; // 检查请求方法是否允许
if (!in_array($method, $allowedMethods)) {
http_response_code(405); // Method Not Allowed
echo json_encode(['error' => 'This method is not allowed.']);
exit;
} // 示例API逻辑
echo json_encode(['message' => 'This API only supports GET requests.']);
?>

5. 结合认证与授权

如果API需要认证,可以在禁止跨域请求的同时验证用户的身份和权限。

<?php
header('Content-Type: application/json'); // 禁止跨域请求
header('Access-Control-Allow-Origin: null'); // 检查认证
if (!isset($_SERVER['HTTP_AUTHORIZATION'])) {
http_response_code(401); // Unauthorized
echo json_encode(['error' => 'Authorization token is required.']);
exit;
} $token = str_replace('Bearer ', '', $_SERVER['HTTP_AUTHORIZATION']); // 验证Token(示例)
if ($token !== 'valid-token') {
http_response_code(403); // Forbidden
echo json_encode(['error' => 'Invalid token.']);
exit;
} // 示例API逻辑
echo json_encode(['message' => 'This API is protected and cannot be accessed from other domains.']);
?>

6. 使用.htaccess限制跨域请求

如果使用Apache服务器,可以通过.htaccess文件限制跨域请求。

# 禁止所有跨域请求
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "null"
</IfModule>

7. 使用Nginx配置限制跨域请求

如果使用Nginx服务器,可以通过配置文件限制跨域请求。

location /api {
if ($http_origin !~* "^https://example.com$") {
return 403;
}
add_header Access-Control-Allow-Origin $http_origin;
}

8. 注意事项

  • 浏览器限制:CORS是浏览器端的限制,服务器端仍然可以接收跨域请求。
  • 预检请求:对于复杂请求(如带有自定义头的请求),浏览器会先发送OPTIONS预检请求,服务器需要正确处理。
  • 安全性:禁止跨域请求可以防止部分攻击,但应结合其他安全措施(如认证、输入验证)全面保护API。

9. 完整示例

以下是一个完整的PHP示例,禁止跨域请求并验证Token:

<?php
header('Content-Type: application/json'); // 禁止跨域请求
header('Access-Control-Allow-Origin: null'); // 检查认证
if (!isset($_SERVER['HTTP_AUTHORIZATION'])) {
http_response_code(401); // Unauthorized
echo json_encode(['error' => 'Authorization token is required.']);
exit;
} $token = str_replace('Bearer ', '', $_SERVER['HTTP_AUTHORIZATION']); // 验证Token(示例)
if ($token !== 'valid-token') {
http_response_code(403); // Forbidden
echo json_encode(['error' => 'Invalid token.']);
exit;
} // 示例API逻辑
echo json_encode(['message' => 'This API is protected and cannot be accessed from other domains.']);
?>

通过以上方法,可以有效禁止API被跨域调用,提升API的安全性。

来自deepseek:php禁止跨域请求的更多相关文章

  1. Ajax_05之跨域请求

    1.跨域请求: Cross Domain Request:跨域名的HTTP请求,浏览器从某个域名下的资源访问了另一域名下的另一资源(协议.域名或是端口号不同): ①浏览器允许跨域请求的情形:  < ...

  2. NodeJ node.js Koa2 跨域请求

    Koa2 .3 跨域请求 Haisen's  需求分析 (localhost:8080 = 前端  [请求]  localhost:8081 = 服务器 ) 1.一个前台    一个服务器    前台 ...

  3. 跨域请求 & jsonp

    0 什么是跨域请求 在一个域名下请求另外一个域名下的资源,就是跨域请求.example 1:比如:我当前的域名是http://che.pingan.com.我现在要去请求http://www.cnbl ...

  4. Nginx反向代理、CORS、JSONP等跨域请求解决方法总结

    由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为 ...

  5. 【转载】Ajax JS 跨域请求

    原文: 简单的ajax请求:http://blog.csdn.net/net_lover/article/details/5172509 复杂的ajax请求:http://blog.csdn.net/ ...

  6. ajax跨域请求解决方案 CORS和JSONP

    什么是跨域: 只要协议.域名.端口有任何一个不同,都会被当成不同的域.而由于浏览器的同源策略(同源策略:域名.协议.端口均相同),浏览器之间要隔离不同域的内容,禁止互相操作,不能执行其他网站的js.所 ...

  7. [1.6W字] 浏览器跨域请求限制的详细原理分析&寻找一种最简单的方式实现XHR跨域(9种方法, 附大招可以纯前端实现跨域!)

    Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...

  8. [1.6W字]浏览器跨域请求的原理, 以及解决方法(可以纯前端实现) #flight.Archives011

    Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...

  9. 利用CORS实现跨域请求(转载)

    跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C中一项新的特性--CORS(Cross-Origin Resource Sh ...

  10. 浅谈linux 下,利用Nginx服务器代理实现ajax跨域请求。

    ajax跨域请求对于前端开发者几乎在任何一个项目中都会用到,众所周知,跨域请求有三种方式: jsonp; XHR2 代理: jsonp: 这种应该是开发中是使用的最多的,最常见的跨域请求方法,其实aj ...

随机推荐

  1. Android7以上https抓包

    1. 问题描述 1.1 运行环境 1.2 问题描述 virtualXposed 不一定支持Android模拟器 无法抓包 https 请求 1.3 问题原因 Android7 以后,系统分了系统证书和 ...

  2. linux tc命令进行网络限速、丢包、延迟设置(简单使用)

    linux自带tc命令版本不是很低的linux系统都自带tc如果你的系统不带这个命令,建议使用类似括号中的命令进行安装 (yum -y install iproute) TC 中使用下列的缩写表示相应 ...

  3. Error: Application Server not specified

    在IDEA中tomcat不能运行,点开Edit Configuration发现如下图情况:tomcat图标猫上有个红叉,且下面有警告提示:Error: Application Server not s ...

  4. apache kylin的一些注意事项(解决kylin报错Storage schema reading not supported)

    1.目前我所使用的kylin版本为2.6.2,有时在完成一次构建后会出现fail to locate kylin.properties的异常,如图所示 经排查,定位到kylin源码中的 org.apa ...

  5. Python 在Excel单元格中应用数据条

    在Excel中添加数据条是一种数据可视化技巧,它通过条形图的形式在单元格内直观展示数值的大小,尤其适合比较同一列或行中各个单元格的数值.这种表示方式可以让大量的数字信息一目了然.本文将介绍如何使用Py ...

  6. 时间轮在 Netty , Kafka 中的设计与实现

    本文基于 Netty 4.1.112.Final , Kafka 3.9.0 版本进行讨论 在业务开发的场景中,我们经常会遇到很多定时任务的需求.比如,生成业务报表,周期性对账,同步数据,订单支付超时 ...

  7. 龙哥量化:macd背离量化的细节问题(图解)

    如果您需要代写技术指标公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 读完本篇,通过解决背离标准量化不清的问题,可以规范背离的使用时机,同时准确过滤假信号,找到真正的 ...

  8. [转]ptp(precision time protocol)时钟同步

    一.介绍1:什么是ptpPTP(Precision Time Protocol) 是一个通过网络同步时钟的一个协议.当硬件支持时,PTP 精度能达到亚微秒,比 NTP(Network Time Pro ...

  9. Solution -「LOCAL」菜

    \(\mathscr{Description}\)   Private link.   给定 \(N,L,X,Y,K\),求选出 \(0\le a_1\le a_2\le\cdots a_{N-1}\ ...

  10. 在linux系统通过OpenSSL工具自签https证书

    工具介绍 OpenSSL是SSL/TLS协议的实现工具 key是私钥文件,用于对发送给客户端的数据加密,以及对从客户端接收的数据进行解密. csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证 ...