如何阻止托管站点的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添加:
这样PHP的curl_proxy = 127.0.0.1:3128 default_socket_timeout = 30curl、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
相关产品推荐
相关产品推荐

