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 也会因为端口被占用而失败。
比如运行如下程序
<?php
exec("sleep 1000;");
然后
立即学习“PHP免费学习笔记(深入)”;
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怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号