本文目录导读:

PHP代码执行漏洞是Web应用中非常严重的安全威胁,攻击者可以利用它直接获取服务器权限或窃取敏感数据,封堵这类漏洞需从代码层面、配置层面和架构层面全方位入手。
以下是一套完整的封堵策略:
第一部分:代码层面(核心防护)
这是最根本的封堵方式,重点在于严格过滤输入和禁用危险函数。
-
严格过滤用户输入(输入校验)
- 对所有来自
$_GET、$_POST、$_REQUEST、$_COOKIE的数据进行白名单或黑名单校验。 - 示例:如果参数应该是数字,必须使用
is_numeric()或ctype_digit()验证;如果是字符串,限制长度并过滤特殊字符(如><等)。
- 对所有来自
-
禁用危险函数(核心措施) 因为这些函数直接执行系统命令或代码,必须在
php.ini中禁用,或在代码层拦截。- 高危函数:
eval()、assert()、preg_replace()(配合/e修饰符时)、create_function()。 - 系统命令函数:
system()、exec()、shell_exec()、passthru()、proc_open()、popen()等。 - 文件操作函数:
include()、require()如果变量可控,可能造成文件包含漏洞,进而转化为代码执行。
修改配置文件
php.ini:disable_functions = eval,assert,create_function,shell_exec,exec,system,passthru,proc_open,popen,pcntl_exec
- 高危函数:
-
严格使用
include/require避免使用变量直接拼接文件路径,如果必须要用,必须进行严格的白名单映射。// 危险写法 $page = $_GET['page']; include($page . '.php'); // 安全写法:白名单映射 $allowed_pages = ['home' => 'home.php', 'user' => 'user.php']; $page_key = $_GET['page'] ?? 'home'; if (isset($allowed_pages[$page_key])) { include($allowed_pages[$page_key]); } else { include('error.php'); } -
对动态代码执行进行封装 如果业务确实需要模板引擎或动态逻辑,不要使用
eval,使用安全的模板引擎(如 Twig, Blade),并开启沙箱模式(Sandbox),禁止在模板中调用危险函数。 -
使用参数化查询(防止SQL注入衍变为代码执行) 使用 PDO 或 MySQLi 的预处理语句,防止攻击者通过
into outfile写入webshell。// 错误做法(拼接SQL) $sql = "SELECT * FROM users WHERE id = " . $_GET['id']; // 正确做法(预处理) $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$_GET['id']]); -
文件上传防护 攻击者常上传
.php或.phtml文件来获取权限。最有效的办法是: 将上传目录设置为禁止执行PHP脚本,并使用随机文件名(如 MD5 哈希),且文件名不能由用户控制。
第二部分:配置层面(环境加固)
-
关闭错误回显 生产环境设置
display_errors = Off,否则,攻击者可以通过错误信息泄露文件路径或SQL语句。 -
open_basedir限制目录 设置open_basedir限制PHP只能访问指定目录,防止攻击者跨目录读取敏感文件(如/etc/passwd)。open_basedir = /var/www/html:/tmp
-
allow_url_include关闭 务必将其设为Off,这可以防止远程文件包含(RFI)漏洞。 -
上传目录禁用执行权限 如果是 Nginx + PHP-FPM 架构,配置上传目录不允许解析
.php。location ~* ^/uploads/.*\.(php|php5|phtml)$ { deny all; } -
升级PHP版本 使用最新稳定版 PHP(如 8.2/8.3),老版本(如 5.x)存在大量已公开的漏洞。
第三部分:安全组件与防御(WAF层)
-
部署 Web 应用防火墙(WAF) 如:ModSecurity(免费)、Cloudflare WAF、安全狗等,WAF 可以拦截常见的漏洞特征,如
eval()、system()、base64_decode()等恶意Payload。 -
使用 RASP(运行时应用自保护) 如果条件允许,部署RASP工具,它们在代码执行前进行拦截,检测到危险函数调用非预期参数时直接阻断。
第四部分:应急与监控(事后补救)
-
去除危险注释与默认账号 不要保留安装文件(
install.php)和默认的 admin 密码。 -
严格文件权限
- 网站源码目录:
755(属主可写,组和用户不可写)。 - 上传目录:
755或750,尽量不要777(防止被写入木马)。
chmod -R 755 /var/www/html chown -R www-data:www-data /var/www/html
- 网站源码目录:
-
日志监控 审计
access.log和error.log,关注针对index.php的异常POST请求或超大GET参数。
核心防御清单
坚决不用 eval()。 2. 对 $_GET/$_POST 变量严格过滤(正则匹配/白名单)。 3. 禁用高危系统函数(disable_functions)。 4. 上传目录禁止执行PHP脚本(Nginx/Apache配置)。 5. 使用 PDO 预处理防 SQL 注入。 6. 关闭 display_errors,开启 open_basedir。 7. 使用 WAF/云防火墙进行前置拦截。
特别提醒:
如果发现已经被植入木马(webshell),单纯修改代码是不够的,攻击者可能已经创建了新的系统用户、修改了文件权限或者留下了后门账户,遇到这种情况,建议立即排查服务器上的异常进程、异常计划任务(Crontab)和环境变量,必要时备份数据重装系统,并修改所有数据库和服务器密码。