如何使用PHP阻止外部Curl访问指定服务器文件?
嘿,我来帮你解决这个外部Curl非法访问的问题!你已经通过AJAX带JWT令牌做了身份验证,但外部还是能直接用Curl调用MyFile.php获取数据对吧?这里有几个实用的方案,一步步来搞定:
既然你已经在AJAX请求里用了JWT作为Authorization头,那首先要确保MyFile.php里必须严格校验这个头的存在和有效性——很多外部Curl请求根本不会带这个头,就算伪造也大概率通不过JWT验证。
直接在MyFile.php开头加上这段校验逻辑:
// 读取Authorization头 $authHeader = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : ''; // 检查头格式是否为"Bearer + JWT令牌" if (!preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) { http_response_code(401); echo json_encode(['error' => '未授权的访问']); exit; } $jwtToken = $matches[1]; // 这里加入你已有的JWT验证逻辑:解码、校验签名、过期时间、用户权限等 // 如果验证失败,直接返回401并终止脚本 // ...你的JWT验证代码...
2. 校验请求来源(增强防护,挡住普通非法请求)
除了JWT,还可以校验请求的Referer头,确保请求来自你的官方网站(虽然Referer可能被伪造,但能挡住大部分没技术含量的Curl请求)。
在JWT校验前后加入这段代码:
$allowedDomain = 'https://your-website.com'; // 替换成你的网站域名 $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; // 检查请求来源是否匹配你的域名 if (!str_starts_with($referrer, $allowedDomain)) { http_response_code(403); echo json_encode(['error' => '禁止访问:非法请求来源']); exit; }
注意:
str_starts_with是PHP 8.0+的函数,如果你的PHP版本较低,可以用substr($referrer, 0, strlen($allowedDomain)) === $allowedDomain替代。
3. 服务器层面直接限制访问(从根源拦截)
如果你的AJAX请求是通过前端入口转发的,可以直接在Web服务器配置里禁止外部直接访问MyFile.php,只允许内部或合法域名请求。
Apache(.htaccess)配置示例
在test目录下的.htaccess里添加:
<Files "MyFile.php"> Order Deny,Allow Deny from all # 允许服务器本地访问(如果AJAX是同服务器转发) Allow from 127.0.0.1 # 允许你的域名的请求 SetEnvIf Referer "^https://your-website.com" allow_referrer Allow from env=allow_referrer </Files>
Nginx配置示例
在你的站点配置里添加:
location ~* /test/MyFile.php { # 校验Referer来源 if ($http_referer !~* ^https://your-website.com) { return 403; } # 校验Authorization头存在 if ($http_authorization !~* Bearer\s) { return 401; } # 正常处理PHP请求的配置 fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
4. 额外的安全小建议
- 别在URL参数里直接暴露函数名(比如
functionName=getName),可以把函数名映射成内部枚举值,比如用action=1代替functionName=getName,降低被恶意猜测的风险。 - 给JWT添加更严格的约束:比如绑定用户IP、设置较短的过期时间,就算令牌泄露也能把风险降到最低。
内容的提问来源于stack exchange,提问作者Nirav Joshi
相关产品推荐
相关产品推荐

