Rumah > php教程 > php手册 > teks badan

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

WBOY
Lepaskan: 2016-06-06 20:07:40
asal
1511 orang telah melayarinya

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;");
Salin selepas log masuk

然后

killall php-fpm
Salin selepas log masuk

杀死 php-fpm 后,

netstat -lntp
Salin selepas log masuk

会看到,9000 端口被一个 sh 进程占用。

...
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      3935/sh
...
Salin selepas log masuk

查看这个 sh 会发现这正是执行 sleep 的那个进程。

...
nobody    3935  0.0  0.0   4272   580 ?        S    11:06   0:00 sh -c cd '/usr/share/nginx/www' ; sleep 1000
...
Salin selepas log masuk
Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan