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

posted @ 2025-02-04 00:04  充实地生活着  阅读(191)  评论(0)    收藏  举报