php如何执行命令行?有服务器执行权限的邪恶函数对比
发布于 作者:苏南大叔 来源:程序如此灵动~本文介绍php
执行命令行的几个函数,就服务器安全角度来说,这几个命令都属于邪恶函数的范畴。正常情况下来说,这些函数是会被禁止执行的。在极个别的情况下,这些函数也有使用的场景,比如和其它程序通过命令行进行交互。本文就是基于这种使用场景为前提的。
大家好,这里是苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。在本文中,讲对于具有服务器端执行命令权限的几个php
函数的区别。测试环境:win10
,php@php7.4.29nts
。本文例子的具体需求事项是:使用php
在服务器端执行python
程序。
开启和禁用(disable_functions
)
首先需要特别明确的是:本文中涉及的函数,理论上来说都是属于危险函数,属于被禁用的范畴。配置的方式是:修改php.ini
中的disable_functions
。
disable_functions = passthru,exec,system,chroot,chgrp,chown,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,shell_exec
参考文章:
因为本文中,就是用来对比相关的函数的。所以,本文的测试环境中必然已经启用了相关函数。主要涉及的函数有:passthru()
、exec()
、shell_exec()
。
passthru()
passthru
的最大特点是:直接把被执行命令的输出,显示出来。意思就是不用echo
,不用return
。
范例如下:
$command = "chdir";
passthru($command);
输出界面截图:
如果想对它的返回值进行修改,那么可能需要ob_start()
和ob_end_flush()
,留待后续讨论。
exec()
exec
则是将命令行的返回值,输出到第二个参数中。
$command = "chdir";
exec($command, $result);
print_r($result);
shell_exec()
shell_exec()
则是执行返回命令执行的结果。
$command = "chdir";
echo shell_exec($command);
这个重音符形式的命令执行方式,还是防不胜防。对比下面两条语句的执行结果:
$command = "chdir";
echo $command;
echo `${command}`;
echo `$command`;
都被直接执行输出了!这种写法在js
语言中,有过讨论。参考文章:
但是,这种重音符的写法等同于shell_exec()
。所以禁用shell_exec()
函数后,上述代码也会报错:
Warning: shell_exec() has been disabled for security reasons。
可能存在的问题
下面是几个可能存在的问题,及解决方案。
中文乱码
在这里,中文乱码的解决方案居然不是utf8
,而是gbk2312
。多少有些令人意外。
header("content-type:text/html;charset=gbk2312");
//...
执行超时
个别命令可能会超时,可能需要下面的命令:
@set_time_limit(0);
//...
没有输出
直接运行命令正常,但是在php
里面调用,就死活没有输出。那么,不妨试试增加了一下管道流命令2>&1
。
$command = "test.py";
passthru($command);
$command = "test.py 2>&1";
passthru($command);
找不到命令
直接运行命令正常,但是在php
里面调用,就是无法找到对应的命令。那么,不妨试试绝对路径。
$command = "python test.py 2>&1";
passthru($command);
$command = '"D:\\Program Files\\Python368\\python.exe" test.py 2>&1';
passthru($command);
相关链接
- https://newsn.net/say/js-dollor.html
- https://newsn.net/say/php-extension-evalhook.html
- https://newsn.net/say/phpsrc-zend-function.html
总结
更多来自苏南大叔的php
文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。