Maison >php教程 >php手册 >php 中运行外部程序的一个潜在风险

php 中运行外部程序的一个潜在风险

WBOY
WBOYoriginal
2016-06-06 20:07:401541parcourir

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;");

然后

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
...
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn