PHP危险函数有哪些

wen PHP项目 3

本文目录导读:

PHP危险函数有哪些

  1. 代码执行类(最危险,直接 RCE)
  2. 命令执行类(命令注入)
  3. 文件操作类(文件包含 / 删除 / 写入)
  4. 数据库操作类(SQL 注入)
  5. 文件上传/包含特定函数
  6. 信息泄露类
  7. 反序列化相关(漏洞链关键)
  8. 高危函数速查表(红队排查清单)
  9. 💡 安全修复建议

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 可控(assertsystem),可导致 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_once
    • require / 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 🟡 中

💡 安全修复建议

  1. 禁用危险函数:在 php.inidisable_functions 中禁用以下函数,这是最直接的防护手段:

    disable_functions = eval, assert, system, exec, shell_exec, passthru, popen, proc_open, pcntl_exec, phpinfo, ...

    注意:eval 是语言结构,无法在 disable_functions 中禁用,只能通过 suhosin 扩展或代码扫描去禁用。

  2. 严格过滤输入:对所有接收用户输入($_GET$_POST$_REQUEST$_COOKIE)的地方,使用白名单校验(如 ctype_digit()、正则表达式严格控制格式),而非黑名单。

  3. 使用预处理语句:数据库操作一律使用 PDO 预处理(prepare + bindValue)或 mysqli_stmt,严禁拼接 SQL。

  4. 禁用动态代码执行:尽量避免使用 eval(),如果必须使用,确保传入的内容是硬编码的固定逻辑,绝不能包含用户输入。

  5. 验证文件上传:使用 finfo_file() 检查 MIME 类型,并重命名为随机文件名,禁止上传 .php.phtml 等脚本文件。

  6. 反序列化安全:尽量使用 json_encode / json_decode 替代 serialize / unserialize,若必须反序列化,对不可信数据进行严格的类白名单过滤(PHP 7.0 以上支持 unserialize 第二参数 allowed_classes)。

抱歉,评论功能暂时关闭!