You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止托管站点的SFTP用户通过PHP代码获取服务器真实IP?

解决服务器真实IP被托管用户通过PHP代码泄露的问题

这确实是个容易被忽略的风险点——Cloudflare的IP隐藏只针对访客主动访问服务器的入站流量,但服务器自己发起的出站请求(比如PHP调用file_get_contents访问外部网站)会直接暴露真实IP。下面给你几个低成本甚至免费的解决方案,按优先级和实用性排序:

1. 禁用PHP的远程文件访问函数

最直接的办法是把能发起HTTP请求的PHP函数禁用掉,从根源上切断用户获取IP的途径。

  • 如果你有权限修改php.ini,可以添加或修改这一行:
    disable_functions = file_get_contents,curl_exec,fopen,fsockopen,stream_socket_client
    
  • 如果只能通过.htaccess配置(比如共享主机),可以写:
    php_value disable_functions "file_get_contents,curl_exec,fopen,fsockopen"
    
    注意:先确认托管站点的业务是否依赖这些函数,如果有需要保留的,针对性删除即可,别一刀切。

2. 用防火墙限制服务器的出站HTTP/HTTPS请求

通过服务器防火墙阻断直接对外的HTTP/HTTPS出站流量,只允许通过Cloudflare代理发起请求(或者干脆禁止所有不必要的出站)。
以Linux的iptables为例:

# 先拒绝所有默认的80/443端口出站请求
iptables -A OUTPUT -p tcp --dport 80 -j DROP
iptables -A OUTPUT -p tcp --dport 443 -j DROP

# 然后允许服务器访问Cloudflare的IP段(需要定期更新Cloudflare官方IP列表)
# 可以写个简单的脚本自动拉取Cloudflare IP并添加规则,避免手动维护

如果用ufw防火墙,逻辑类似:先拒绝80/443出站,再允许Cloudflare的IP段访问这些端口。

3. 配置本地反向代理中转出站请求

让所有PHP发起的外部请求都通过本地反向代理(比如Nginx、Squid)走Cloudflare的代理IP,这样外部网站看到的是Cloudflare的IP而非服务器真实IP。

  • 比如先在本地搭建一个Squid代理,然后在PHP里全局配置代理:
    在php.ini添加:
    curl_proxy = 127.0.0.1:3128
    default_socket_timeout = 30
    
    这样PHP的curl、file_get_contents都会默认走这个代理,只要代理配置成通过Cloudflare出站,就能隐藏真实IP。

4. 给PHP运行环境加沙箱限制

如果托管用户不需要高级PHP权限,可以把PHP运行在更严格的环境里:

  • 用open_basedir限制PHP只能访问指定目录,同时禁用危险函数:
    php_value open_basedir "/var/www/your-user-site:/tmp"
    php_value disable_functions "file_get_contents,curl_exec"
    
  • 或者用PHP-FPM的chroot功能,把PHP进程隔离在单独的文件系统环境里,进一步限制对外请求的能力。

额外注意事项

  • 定期检查服务器的出站流量日志,看看有没有异常请求;
  • 如果用户确实需要调用某些外部API,不要全部放开,而是单独允许访问特定域名(比如通过防火墙规则或代理配置);
  • Cloudflare的IP段会不定期更新,记得定期同步到防火墙规则里。

内容的提问来源于stack exchange,提问作者CodeGeekBot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:01:42