在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. 中电金信:加快企业 AI 平台升级,构建金融智能业务新引擎

    ​ 在当今数字化时代的浪潮下,人工智能(AI)技术的蓬勃发展正为各行业带来前所未有的变革与创新契机.尤其是在金融领域,AI 模型的广泛应用已然成为提升竞争力.优化业务流程以及实现智能化转型的关键驱动力 ...

  2. 【Python】2023年Python期末复习题

    Python百分百挂科指南 出题人,出的题,水平不咋样,给出的参考答案一堆错误,给出的正确选项单词都能拼错. 非本次考试人员不必看,没有参考价值 选择题 下列哪个标识符是不合法的()D A. Name ...

  3. Spring注解之-@ConditionalOnExpression表达式

    @ConditionalOnExpression("'true") 当括号中的内容为true时,使用该注解的类被实例化,支持语法如下: @ConditionalOnExpressi ...

  4. 《jQueryEasyUI从零开始学》-施尧2018一书的配套源代码和学习资源

    <jQueryEasyUI从零开始学>-施尧2018一书的配套源代码和学习资源:下载地址 提取码:uuly

  5. 【OpenGL ES】GLSL基础语法

    1 前言 ​ 本文将介绍 GLSL 中数据类型.数组.结构体.宏.运算符.向量运算.矩阵运算.函数.流程控制.精度限定符.变量限定符(in.out.inout).函数参数限定符等内容,另外提供了一个 ...

  6. 长连接网关技术专题(四):爱奇艺WebSocket实时推送网关技术实践

    本文由爱奇艺技术团队原创分享,原题<构建通用WebSocket推送网关的设计与实践>,有优化和改动. 1.引言 丛所周之,HTTP协议是一种无状态.基于TCP的请求/响应模式的协议,即请求 ...

  7. IM开发干货分享:网易云信IM客户端的聊天消息全文检索技术实践

    1.引言 在IM客户端的使用场景中,基于本地数据的全文检索功能扮演着重要的角色,最常用的比如:查找聊天记录.联系人,就像下图这样. ▲ 微信的聊天记录查找功能 类似于IM中的聊天记录查找.联系人搜索这 ...

  8. 可扩展系统——基于SPI扩展

    一.我们为什么讨论SPI? 为具有悠久历史的大型项目(屎山)添加新功能时,我们常常不太好评估变更的影响范围.因为原系统不具备良好的扩展性,导致修改整体发散,且不易单测.此时可以考虑使用接口来描述业务逻 ...

  9. 自动化滑动极验v3示例

    import random import ddddocr from playwright.sync_api import sync_playwright import time import requ ...

  10. biancheng-Linux教程

    目录http://c.biancheng.net/linux_tutorial/ 1Linux简介2Linux安装3Linux文件和目录管理4Linux打包(归档)和压缩5Vim文本编辑器6Linux ...