来自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的安全性。

浙公网安备 33010602011771号