php 中运行外部程序的一个潜在风险
程序员文章站
2024-01-11 19:17:16
...
php 中有 exec system popen 等一系列运行外部程序的函数。在 web 环境中使用这些函数的时候,即使控制好了权限,保证了被执行程序本身的安全,还可能有另外的潜在风险。 php 的这些函数实际上是使用了 popen 函数。popen 利用了 vfork 来启动一个 shell 子
php 中有 exec system popen 等一系列运行外部程序的函数。在 web 环境中使用这些函数的时候,即使控制好了权限,保证了被执行程序本身的安全,还可能有另外的潜在风险。
php 的这些函数实际上是使用了 popen 函数。popen 利用了 vfork 来启动一个 shell 子进程来执行命令。但是 popen 并没有在子进程中关闭原有的进程的文件描述符。这样子进程也会占有这些文件描述符,即使它们并不需要,如果子进程长时间运行,还会导致这些资源没法释放。
比如在 php-fpm 环境中,如果在子进程长时间运行时 php-fpm 崩溃,或者手动停止服务,监听的端口 9000 所对应的文件描述符还会被子进程共享。此时想重新启动 php-fpm 也会因为端口被占用而失败。
比如运行如下程序
然后
killall php-fpm杀死 php-fpm 后,
netstat -lntp会看到,9000 端口被一个 sh 进程占用。
... tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 3935/sh ...查看这个 sh 会发现这正是执行 sleep 的那个进程。
... nobody 3935 0.0 0.0 4272 580 ? S 11:06 0:00 sh -c cd '/usr/share/nginx/www' ; sleep 1000 ...原文地址:php 中运行外部程序的一个潜在风险, 感谢原作者分享。
推荐阅读
-
单例 - PHP程序运行的时候,既然是每一个HTTP请求对应一个数据库PDO连接对象实例
-
php中的方法,从网上下载了一个网站程序,这个步骤没看懂是干嘛的,求指教
-
PHP中 上运行 root 用户才可以运行的外部程序
-
QT中实现程序只运行一个实例--应用程序的单例化
-
Java虚拟机学习笔记(2)——一个Java程序在虚拟机中的运行过程
-
pytorch中’tensorboard‘不是内部或外部命令,也不是可运行的程序
-
JAVA 基础 / 第四课:在ECLIPSE中运行第一个 JAVA 程序以及找不到类的问题
-
这是我在做的一个系统中的新闻增加程序,可以上传图片,也可以输_PHP
-
php-当一个程序被调试时 后台(或者说debugger)是如何工作运行的
-
php-当一个程序被调试时 后台(或者说debugger)是如何工作运行的