[小记录]当PHP脱掉“危险外衣”:禁用函数背后的攻防博弈

宗同学
2025-04-13 / 0 评论 / 37 阅读 / 正在检测是否收录... / 搜一下
温馨提示:
本文最后更新于2025年04月13日,已超过18天没有更新,若内容或图片失效,请留言反馈。

为什么要禁用高危函数?

禁用高危函数是保障PHP应用安全的核心策略。这些函数本身具备强大的系统操作能力,但一旦被攻击者恶意利用,可能导致服务器被完全控制、数据泄露甚至系统崩溃


一、系统命令与进程操作类(高危)

  1. 执行系统命令

    • pcntl_fork:创建子进程,可能被用于恶意进程繁殖
    • pcntl_alarm:设置进程警报,可能干扰系统稳定性
  2. 动态加载扩展

    • dl():运行时加载PHP扩展,易引发兼容性问题和安全漏洞

二、文件系统操作类(中高危)

  1. 重命名

    • unlink:删除文件
    • rename:重命名文件
    • rmdir:删除目录
      禁用原因:防止恶意删除或篡改服务器关键文件
  2. 文件权限修改

    • chown:修改文件所有者
    • chgrp:修改文件所属组
      禁用原因:避免提权攻击或系统文件权限被破坏
  3. 目录操作

    • mkdir:创建目录
    • scandir:列出目录内容
      注意:部分框架(如ThinkPHP)依赖scandir,需谨慎禁用

三、代码执行类(极高危)

  1. 动态代码执行

    • eval:直接执行字符串作为PHP代码
    • assert:断言检查,但可被滥用执行代码
    • create_function:已废弃,存在代码注入风险
      禁用原因:此类函数是代码注入攻击的主要入口

四、环境变量与配置操作类(中危)

  1. 环境变量操作

    • putenv:修改系统环境变量
    • getenv:读取环境变量
      禁用原因:可能泄露敏感信息或破坏环境一致性
  2. INI配置修改

    • ini_alter/ini_restore:动态修改PHP配置
      风险提示:可能导致不可预测的运行时行为

五、系统信息获取类(低危)

  • getmyuid:获取脚本所有者UID
  • getmypid:获取当前进程ID
  • getmyinode:获取文件inode信息
    禁用原因:可能泄露服务器内部信息,但风险较低

禁用方法示例(php.ini配置)

disable_functions = pcntl_fork,pcntl_alarm,dl,unlink,rename,rmdir,chown,chgrp,scandir,eval,assert,create_function,putenv,getenv,ini_alter,ini_restore,getmyuid,getmypid,getmyinode

替代方案建议

  • 文件操作:使用权限控制替代直接禁用(如限制目录权限)
  • 动态代码:改用闭包或预定义函数
  • 进程管理:通过系统级守护进程(如Supervisor)替代PHP进程控制

如需进一步探讨某类函数的具体案例或配置细节,可补充说明方向。

实际操作

m9fb95mb.png

如上图所示,我使用的是 小皮面板 ,在软件商店找到已经安装的php然后找到禁用函数的功能然后粘贴想要禁用的函数即可。

经过使用,下面的函数可以直接禁用:

phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen

总结

禁用高危的函数有助于我们防范不法分子的攻击,定期维护网站,让自己的网站平稳运行。

5

评论

博主关闭了所有页面的评论