### PHP 原生的敏感函数有哪些

1. 代码执行 / 命令执行

这些函数可以直接执行系统命令或 PHP 代码，是最高危的一类函数

- `eval()`: 将字符串作为 PHP 代码执行
- `assert()`: 检查一个字符串是否为合法的 PHP 代码，如果是则执行
- `shell_exec()`: 通过 shell 执行命令并返回所有输出
- `exec()`: 执行一个外部程序
- `system()`: 执行外部程序并显示输出
- `passthru()`: 执行外部程序并直接将原始输出传递给浏览器
- `proc_open()`: 执行一个命令，并打开指向其标准输入/输出/错误的文件指针
- `popen()`: 打开一个指向进程的管道。

2. 文件包含 / 读取 / 写入

这些函数如果参数可控，可能导致任意文件读取、写入，甚至是远程代码执行（RCE）

- `include()` / `include_once()`: 包含并执行指定文件
- `require()` / `require_once()`: 包含并执行指定文件，若失败则抛出致命错误
- `file_get_contents()`: 将整个文件读入一个字符串
- `file_put_contents()`: 将一个字符串写入文件
- `fopen()` / `fread()` / `fwrite()`: 用于打开、读取和写入文件
- `unlink()`: 删除文件
- `move_uploaded_file()`: 将上传的文件移动到新位置
- `readfile()`: 读取文件并写入到输出缓冲

3. 数据处理与反序列化

这些函数在处理用户输入时如果不加限制，可能导致反序列化漏洞

- `unserialize()`: 将字符串反序列化为 PHP 值
- `json_decode()`: 将 JSON 字符串解码为 PHP 变量
- `gzuncompress()` / `gzinflate()`: 解压压缩字符串，可能引发内存溢出或拒绝服务。

4. 变量操作与反射

- `extract()`: 从数组中导入变量到当前符号表。如果数组内容可控，可能覆盖现有变量
- `parse_str()`: 将字符串解析成变量，同样可能导致变量覆盖
- `create_function()`: 创建一个匿名函数。在 PHP 7.2.0 之后已被废弃，但旧版本中可能存在代码执行风险

5. 数据库操作

尽管大多数现代框架都有自己的 ORM 和查询构造器，但仍需注意原生数据库函数的使用，尤其是拼接 SQL 语句时

- `mysql_query()`: 执行 SQL 查询（已废弃）
- `mysqli_query()`: 执行 SQL 查询
- `PDO::query()`: 执行 SQL 查询

6. 其他

- `header()`: 用于设置 HTTP 头信息。如果参数可控，可能导致 CRLF 注入或重定向漏洞
- `die()` / `exit()`: 终止脚本执行。在某些情况下，可能导致逻辑漏洞