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

如何禁用PHP中的反引号运算符?已禁用函数仍无效

如何禁用PHP的反引号运算符?

你提到已经在php.ini中禁用了一批危险函数,但反引号运算符仍能正常执行命令(如下图所示):

shell result

首先我发现一个关键问题:你配置的disable_functions使用了中文双引号,这会导致整个配置项被PHP忽略——你的禁用列表根本没生效!这大概率是反引号还能工作的核心原因。

第一步:修复disable_functions的配置格式

把配置里的中文引号换成英文双引号(或者直接省略引号,多个函数用逗号分隔即可),正确的配置应该是这样:

disable_functions = apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode, curl_exec,curl_multi_exec,parse_ini_file,show_source, symlink

修改后记得重启PHP-FPM服务,在你的Docker容器里可以执行以下命令:

docker exec <你的容器名称> php-fpm -t && docker exec <你的容器名称> service php-fpm restart

第二步:彻底禁用反引号运算符

反引号是PHP的语言结构(不是普通函数),虽然它底层依赖shell_exec函数,禁用shell_exec后多数情况下反引号会失效,但如果要更彻底地阻断它,可以借助Suhosin扩展:

  1. 安装Suhosin扩展(针对PHP 7.2,你可以通过PECL安装):
pecl install suhosin-0.9.39
  1. 在php.ini中添加以下配置:
suhosin.executor.disable_backticks = On

这个配置会直接禁用反引号的执行能力,即使底层函数配置有疏漏,也能阻止它运行系统命令。

验证配置是否生效

你可以创建一个简单的PHP脚本测试:

<?php
echo `whoami`;
?>

如果配置生效,访问这个脚本会抛出类似Warning: shell_exec() has been disabled for security reasons的错误,或者没有任何命令执行结果输出。


内容的提问来源于stack exchange,提问作者Максим Барулин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:13