本文目录导读:

- 代码执行类(最危险,直接 RCE)
- 命令执行类(命令注入)
- 文件操作类(文件包含 / 删除 / 写入)
- 数据库操作类(SQL 注入)
- 文件上传/包含特定函数
- 信息泄露类
- 反序列化相关(漏洞链关键)
- 高危函数速查表(红队排查清单)
- 💡 安全修复建议
PHP 危险函数主要分为代码执行、命令执行、文件操作、数据库操作及信息泄露等几大类。
以下整理的核心危险函数清单,按风险级别分类,并附上修复建议,方便你用于代码审计或安全加固。
代码执行类(最危险,直接 RCE)
这类函数可以直接执行 PHP 代码,如果参数可控,等同于拿到服务器权限。
eval($code):将字符串作为 PHP 代码执行。是最危险的函数,没有之一。assert($value):在 PHP 7.2 之前,如果传入字符串,会作为代码执行。preg_replace($pattern, $replacement, $subject):当$pattern以/e结尾时(PHP 5.5 之前),$replacement会被当做代码执行。注意:PHP 7.0 已移除/e修饰符。create_function($args, $code):创建一个匿名函数,但$code如果可控,会执行任意代码。(PHP 7.2 已弃用,PHP 8.0 已移除)。call_user_func($callback, $params)/call_user_func_array($callback, $params):回调函数,$callback可控(assert、system),可导致 RCE。
命令执行类(命令注入)
这类函数直接调用系统 Shell,如果参数可控,可以执行系统命令。
system($cmd):执行命令并输出结果。exec($cmd):执行命令并返回最后一行结果。shell_exec($cmd)/ 反引号`$cmd`:执行命令并返回所有输出。passthru($cmd):执行命令并直接输出原始二进制输出。popen($cmd, $mode):打开一个进程管道,执行命令。proc_open($cmd, $descriptorspec, $pipes):执行命令并允许读写。pcntl_exec($path, $args):在当前进程空间执行指定程序。
文件操作类(文件包含 / 删除 / 写入)
这类函数可能导致本地文件包含(LFI/RFI)或文件上传/删除漏洞。
- 文件包含(重点):
include/include_oncerequire/require_once- 如果这些函数的参数是用户可控的,且未做严格过滤,可以包含任意文件(如
php://filter读取源码,或直接包含图片马执行)。
- 文件写入/删除:
file_put_contents($filename, $data):如果文件名或内容可控,可写入木马。fwrite($handle, $string)/fputs():写入文件。unlink($filename):删除文件(可被利用删除站点关键文件导致 DoS)。rename():重命名文件(可覆盖.htaccess等配置文件)。
- 文件读取:
file_get_contents()、readfile():结合参数可读取任意文件。
数据库操作类(SQL 注入)
虽然 PDO 封装了安全,但危险函数集中在字符串拼接的 SQL 执行上。
mysql_query()/mysqli_query()/mysqli_multi_query():SQL 语句由拼接而成,且未使用预处理语句,就是经典的 SQL 注入点。PDO::query()或PDO::exec():如果使用不当(未使用prepare绑定参数),同样存在注入风险。
文件上传/包含特定函数
move_uploaded_file($tmp, $dest):存在上传漏洞时,用于将恶意文件移动到 Web 根目录。parse_ini_file():在 PHP 5.3 之前,如果第二参数为true,对文件内容解析时可能触发代码执行(现已修复,但仍需关注配置文件可控性)。
信息泄露类
phpinfo():输出服务器详细的 PHP 配置信息(包括路径、扩展、环境变量),为攻击者提供侦察信息。print_r($var)/var_dump($var)/debug_zval_dump():如果输出包含数据库密码或密钥的对象,会泄露敏感信息。get_defined_vars():泄露所有已定义变量(包括环境变量、Session、POST/GET 数据)。
反序列化相关(漏洞链关键)
unserialize($data):如果序列化的数据是用户可控的(如$_POST、$_COOKIE),该函数会触发 PHP 对象魔术方法(如__wakeup()、__destruct()),配合类中的危险方法可造成 RCE。serialize():本身安全,但用于攻击,通常配合unserialize出现。
高危函数速查表(红队排查清单)
| 类别 | 函数名 | 风险等级 |
|---|---|---|
| 代码执行 | eval, assert, preg_replace ( /e ) |
🔴 极高 |
| 代码执行 | create_function, call_user_func |
🔴 极高 |
| 命令执行 | system, exec, shell_exec, passthru |
🔴 极高 |
| 命令执行 | popen, proc_open |
🟠 高 |
| 文件包含 | include, require |
🔴 极高 |
| 文件操作 | file_put_contents, fwrite, unlink |
🟠 高 |
| 数据库 | mysqli_query(拼接时) |
🔴 极高 |
| 反序列化 | unserialize |
🔴 极高 |
| 信息泄露 | phpinfo |
🟡 中 |
💡 安全修复建议
-
禁用危险函数:在
php.ini的disable_functions中禁用以下函数,这是最直接的防护手段:disable_functions = eval, assert, system, exec, shell_exec, passthru, popen, proc_open, pcntl_exec, phpinfo, ...
注意:
eval是语言结构,无法在disable_functions中禁用,只能通过suhosin扩展或代码扫描去禁用。 -
严格过滤输入:对所有接收用户输入(
$_GET、$_POST、$_REQUEST、$_COOKIE)的地方,使用白名单校验(如ctype_digit()、正则表达式严格控制格式),而非黑名单。 -
使用预处理语句:数据库操作一律使用 PDO 预处理(
prepare+bindValue)或mysqli_stmt,严禁拼接 SQL。 -
禁用动态代码执行:尽量避免使用
eval(),如果必须使用,确保传入的内容是硬编码的固定逻辑,绝不能包含用户输入。 -
验证文件上传:使用
finfo_file()检查 MIME 类型,并重命名为随机文件名,禁止上传.php、.phtml等脚本文件。 -
反序列化安全:尽量使用
json_encode/json_decode替代serialize/unserialize,若必须反序列化,对不可信数据进行严格的类白名单过滤(PHP 7.0 以上支持unserialize第二参数allowed_classes)。