最直接有效的办法是避免将用户输入直接传给include、require等函数;必须动态加载时应采用白名单机制,禁用allow_url_include和allow_url_fopen,并结合realpath路径校验与open_basedir限制。

严格校验文件路径,禁用动态拼接
最直接有效的办法是避免把用户输入直接传给include、require等函数。如果业务确实需要动态加载文件,应采用白名单机制:只允许预设的几个合法值,比如['home', 'about', 'contact'],其他一概拒绝。不要用“过滤掉../”这类黑名单思路,容易被双写、URL编码、大小写混淆等方式绕过。
关闭危险配置,限制PHP协议流
在php.ini中设置以下关键项:
-
allow_url_include = Off(彻底禁用远程包含) -
allow_url_fopen = Off(防止通过file_get_contents等间接触发协议流) -
open_basedir设为Web根目录,限制脚本只能访问指定路径 -
disable_functions中加入ini_set, putenv, exec, system, shell_exec, passthru等高危函数
路径规范化与安全解析
若必须处理用户传入的路径,先用realpath()获取绝对路径,再检查是否落在允许范围内。例如:
不安全写法:include($_GET['page'] . '.php');
安全写法示例:
$allowed_dir = '/var/www/html/templates/';$file = realpath($allowed_dir . $_GET['page'] . '.php');if (strpos($file, $allowed_dir) === 0 && is_file($file)) { include($file); }
运行时加固与纵深防护
单靠代码层不够,需多层设防:
- Web服务器(如Nginx/Apache)配置禁止访问
.php以外的敏感后缀,如.log、.conf、.bak - 日志文件权限设为
640,属主为root:www-data,防止被低权限Web进程读取 - 启用RASP(运行时应用自我保护)工具,在PHP扩展层拦截异常文件包含行为
- 对
phpinfo()、php -v等调试页面做访问控制,避免泄露临时文件名等关键信息
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











