在 PHP 中,防止 API 被跨域调用可以通过设置适当的 HTTP 响应头来实现。跨域资源共享(CORS,Cross-Origin Resource Sharing)机制允许或拒绝来自不同源的请求。为了禁止跨域调用,你可以在你的 PHP 脚本中设置 Access-Control-Allow-Origin 头为 null 或者不设置这个头。

下面是一个简单的例子,展示了如何在 PHP 中禁止跨域调用:

<?php
// 设置 HTTP 响应头,禁止跨域调用
header("Access-Control-Allow-Origin: null"); // 你的 API 逻辑
$response = array(
"message" => "API is working, but not allowed to be called from a different origin."
); // 设置响应头为 JSON
header('Content-Type: application/json'); // 输出 JSON 响应
echo json_encode($response);
?>

在这个例子中,header("Access-Control-Allow-Origin: null"); 告诉浏览器这个资源不允许被任何外部源访问。这意味着,只有当请求来自同一个源(即同源策略下的请求)时,才能访问这个 API。

其他方法

1.查 Referer 头‌:
你可以检查 HTTP 请求的 Referer 头来验证请求是否来自一个允许的源。但请注意,Referer 头可以被伪造或省略,所以这不是一个完全可靠的方法。

if (isset($_SERVER['HTTP_REFERER'])) {
$allowed_domain = 'https://yourdomain.com';
if (strpos($_SERVER['HTTP_REFERER'], $allowed_domain) !== 0) {
header('HTTP/1.1 403 Forbidden');
echo json_encode(array("message" => "Access denied."));
exit;
}
} else {
header('HTTP/1.1 403 Forbidden');
echo json_encode(array("message" => "Access denied."));
exit;
} // 你的 API 逻辑

‌2.使用服务器配置‌:
如果你使用的是 Apache 或 Nginx 服务器,你也可以通过服务器配置来限制跨域请求。

(1)Apache‌:

在 .htaccess 文件中添加以下配置:

SetEnvIf Origin "http(s)?://(www\.)?yourdomain\.com(:[0-9]+)?$" ALLOW_ORIGIN
Header set Access-Control-Allow-Origin %{ALLOW_ORIGIN}e env=ALLOW_ORIGIN

(2)Nginx‌:
在 Nginx 配置文件中添加以下配置:

if ($http_origin ~* http(s)?://(www\.)?yourdomain\.com(:[0-9]+)?$) {
add_header 'Access-Control-Allow-Origin' "$http_origin";
}

总结

最简单和直接的方法是通过设置 Access-Control-Allow-Origin 头来禁止跨域调用。然而,根据应用的安全需求,你可能需要结合其他方法,如检查 Referer 头或使用服务器配置,来提供更全面的保护。

【答题系统可参考】php 禁止api被跨域调用的更多相关文章

  1. ajax——CORS跨域调用REST API 的常见问题以及前后端的设置

    RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前 ...

  2. 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

    新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...

  3. 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

    客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...

  4. 改变mvc web api 支持android ,ios ,ajax等方式跨域调用

    公司一个移动后端的项目用到了 webapi 项目搭建到外网环境共app开发者调用测试接口时遇到了一个问题 接口不允许跨域调用 .查阅资料明白 同源策略原则根据请求报头值 Origin 与回应报头值 A ...

  5. web api 跨域请求,ajax跨域调用webapi

    1.跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服 ...

  6. AJAX跨域问题解决方法(1)——禁止浏览器进行跨域限制

    思路:通过命令行修改浏览器启动参数,使得浏览器不进行跨域检查,从而允许跨域 方法:命令行参数启动浏览器后添加参数--disable-web-security 例:chrome --disable-we ...

  7. jQuery跨域调用Web API

    我曾经发表了一篇关于如何开发Web API的博客,链接地址:http://www.cnblogs.com/guwei4037/p/3603818.html.有朋友说开发是会开发了,但不知道怎么调用啊? ...

  8. Web API 解决跨域问题

    一.跨域问题的由来 同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容. 正是由于这个原因,我们不同项目之间的调用就会被浏览器阻 ...

  9. 在Angular.js中的H5页面调用Web api时跨域问题处理

    /// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...

  10. Asp.net Vnext api CORS( 跨域)

    概述 跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的.CORS系统定义了一种浏览器和服务器交互的方式 ...

随机推荐

  1. postgresql序列重复问题处理

    问题 在执行数据插入时,postgresql 提示more than one owned sequence found错误.这个和之前文章中写的序列编号错乱不同,是由数据表的一个列生成了多个序列导致的 ...

  2. 待遇任务执行器(dy-task-actuator-simple)文档

    待遇任务执行器(dy-task-actuator-simple)文档 简介 简称 dtas 吧.这是一个尚在起步但无需太多功能的执行器. 心血来潮,做了一个任务执行器,倒不是一定要重复造轮子,而是没有 ...

  3. Linux 添加开机自启动

    rc.local 方式 一.& 在 Linux 命令后加上 &  可以在后台运行 二.nohup 对 SIGHUP 信号免疫,对 SIGINT 信号不免疫,可用 shopt | gre ...

  4. jenkins build

    clean test org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent org.owasp:dependency-check-maven:5.3.0 ...

  5. 报错test_features2d.cpp:51:10: fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件

    问题描述: ubuntu18.04安装opencv4.5.1+contrib 报错test_features2d.cpp:51:10: fatal error: features2d/test/tes ...

  6. 记一次 .NET某电商医药网站 CPU爆高分析

    一:背景 1. 讲故事 准备明年把.NET高级调试的训练营的课程进行重构,采用案例引导式,而CPU爆高类有不少是程序员在写代码的时候不注意时间复杂度,在数据量稍微大一点的情况直接幻化成了死循环,时间复 ...

  7. 【BUG排查记】HttpUtil和SpringSecurity结合的坑

    一.背景 最近为了做微服务高可用和优化上线流程,我参与了一个微服务的改造开发. 主要包括redis切换哨兵模式.接入高可用xxljob集群.配置和升级脚本优化. 二.问题描述   项目改造提测后,测试 ...

  8. 深入解析 Spring AI 系列:解析OpenAI接口对接

    今天我们将主要探讨OpenAI是如何进行接口对接的,虽然我们不打算深入细节,但会对整体流程进行一个大概的了解.后续会逐步分析其中的具体细节,大家可以耐心等待,逐步展开.好的,现在让我们开始,下面是我简 ...

  9. 单点登录-OAuth2

    单点登录的实现原理 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来 ...

  10. Android平台架构及特性

    Android平台架构及特性 Android系统的底层是建立在Linux系统之上,改平台由操作系统.中间件.用户界面和应用软件四层组成,它采用一种被称为软件叠层(Software Stack)的方式进 ...