来自deepseek:php禁止跨域请求
在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禁止跨域请求的更多相关文章
- Ajax_05之跨域请求
1.跨域请求: Cross Domain Request:跨域名的HTTP请求,浏览器从某个域名下的资源访问了另一域名下的另一资源(协议.域名或是端口号不同): ①浏览器允许跨域请求的情形: < ...
- NodeJ node.js Koa2 跨域请求
Koa2 .3 跨域请求 Haisen's 需求分析 (localhost:8080 = 前端 [请求] localhost:8081 = 服务器 ) 1.一个前台 一个服务器 前台 ...
- 跨域请求 & jsonp
0 什么是跨域请求 在一个域名下请求另外一个域名下的资源,就是跨域请求.example 1:比如:我当前的域名是http://che.pingan.com.我现在要去请求http://www.cnbl ...
- Nginx反向代理、CORS、JSONP等跨域请求解决方法总结
由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为 ...
- 【转载】Ajax JS 跨域请求
原文: 简单的ajax请求:http://blog.csdn.net/net_lover/article/details/5172509 复杂的ajax请求:http://blog.csdn.net/ ...
- ajax跨域请求解决方案 CORS和JSONP
什么是跨域: 只要协议.域名.端口有任何一个不同,都会被当成不同的域.而由于浏览器的同源策略(同源策略:域名.协议.端口均相同),浏览器之间要隔离不同域的内容,禁止互相操作,不能执行其他网站的js.所 ...
- [1.6W字] 浏览器跨域请求限制的详细原理分析&寻找一种最简单的方式实现XHR跨域(9种方法, 附大招可以纯前端实现跨域!)
Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...
- [1.6W字]浏览器跨域请求的原理, 以及解决方法(可以纯前端实现) #flight.Archives011
Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...
- 利用CORS实现跨域请求(转载)
跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C中一项新的特性--CORS(Cross-Origin Resource Sh ...
- 浅谈linux 下,利用Nginx服务器代理实现ajax跨域请求。
ajax跨域请求对于前端开发者几乎在任何一个项目中都会用到,众所周知,跨域请求有三种方式: jsonp; XHR2 代理: jsonp: 这种应该是开发中是使用的最多的,最常见的跨域请求方法,其实aj ...
随机推荐
- GraphQL Part I: hello, world.
GraphQL with ASP.NET Core (Part- I : Hello World) 厌倦了 REST? 让我们谈一下 GraphQL, GraphQL 提供声明式的方式从服务器获取数据 ...
- 我的世界服务器搭建教程 兼容Paper核心 兼容Spigot核心
注意:该服务器是基于Paper1.20.1核心进行初始化,默认兼容spigot插件. 一.配置JDK环境 二. 服务器核心配置 三.服务器启动 四.加入游戏 现在搭建出来的是原版生存服务器,接下来需要 ...
- Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标
一.前言 通过在通道画面上拾取鼠标按下的坐标,然后鼠标移动,直到松开,根据松开的坐标和按下的坐标,绘制一个矩形区域,作为热点或者需要电子放大的区域,拿到这个坐标区域,用途非常多,可以直接将区域中的画面 ...
- Qt视频监控系统一个诡异问题的解决思路(做梦都想不到)
一.前言 由于Qt版本众多,几百个版本之间存在不兼容的情况,为此如果要兼容很多版本,没有取巧的办法和特殊的捷径,必须自己亲自安装各个版本编译运行并测试,大问题一般不会有,除非缺少模块,小问题还是不断有 ...
- IDEA利用阿里云插件部署Springboot项目
下载插件 搜索 Alibaba Cloud Toolkit 插件,并安装. IDEA增加Run/Debug Configurations Add New Configuration - Deploy ...
- 不为人知的网络编程(十二):彻底搞懂TCP协议层的KeepAlive保活机制
文中引用了参考资料中的部分内容,本文参考资料详见文末"参考资料"一节,感谢资料分享者. 1.引言 对于IM开发者而言,网络保活这件事再熟悉不过了,比如这是我最近一篇有关网络保活话题 ...
- Android开发快速入门iOS开发概览
注:本文同步发布于微信公众号:stringwu的互联网杂谈 Android开发快速入门iOS开发概览 1 前言 笔者总结了自己在拥有Android开发的相关基础后入门iOS开发时遇到的点点滴滴给其他想 ...
- CDS标准视图:维护活动类型 I_MaintenanceActivityType
视图名称:维护活动类型 I_MaintenanceActivityType 视图类型:基础 视图代码: 点击查看代码 @ObjectModel.supportedCapabilities: [ #AN ...
- 为你的Blazor程序加入本地化多语言功能
本地化 本地化是为给定语言和地区定制应用程序的过程. BootstrapBlazor 组件允许您将其 UI 元素转换为所需的语言.这包括按钮.过滤器操作符属性等文本.组件内部默认使用当前请求 UI 文 ...
- WPF 动态加载嵌入主程序的DLL
WPF 动态加载嵌入主程序的DLL,好处是节省文件数量,坏处是启动影响加载速度. 首先将DLL添加进项目,选择添加现有项,设置生成操作为"嵌入资源". 代码: public App ...