PHP中关于系统相关函数的应用
2015-06-08 12:53
459 查看
string shell_exec ( string
等同于执行系统命令行。不能用于检测命令是否执行成功。因为出错或者命令本身不产生输出,对于不产生输出的命令就无法检测是否执行成功。如果有这方面的要求,可以使用exec代替这个函数。
string exec ( string
)
exec函数只会输出输出结果的最后一行,并不能完整的输出结果。推荐用system函数
把字符串转码为可以在 shell 命令里使用的参数
string escapeshellarg ( string
shell 元字符转义
string escapeshellcmd ( string
escapeshellcmd() 对字符串中可能会欺骗
shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
passthru函数常用于输出图像。因为这个函数可以输出原始的二进制流信息。
如果想对执行一个命令比popen有更好的控制,那就是使用proc_open函数代替popen函数。主要是proc_open的参数更多。
所以对于进程命令的执行推荐使用proc_open.不过一般服务器为了防止意外,所以与系统有关的函数都是被禁止的。
proc_open相关函数的运用
http://www.cppblog.com/amazon/archive/2011/12/01/161281.aspx
http://blog.lifezq.com/pma/procopen.html
最后来讲一个使用这个系统函数escapeshellcmd过滤之后仍然会产生的一个漏洞:
php escapeshellcmd多字节编码漏洞解析及延伸
http://www.xfocus.net/articles/200805/979.html
试验过程:
正常情况下:
$e = escapeshellcmd($_GET['c']);
// here we don't care if $e has spaces
$result = system("echo
$e");
echo
$result;
在浏览器地址栏输入:xxxxx.php?c=loveshell%bf;id;
输出的结果是
loveshell乱码;id
如果加入一行代码putenv(“LANG=zh_CN.GBK");
// GBK编码下就会出问题
putenv("LANG=zh_CN.GBK");
$e = escapeshellcmd($_GET['c']);
// here we don't care if $e has spaces
$result = system("echo
$e");
echo
$result;
输出结果就是
lloveshell縗 uid=99(nobody) gid=4294967295 groups=4294967295
这个id命令就执行了。
这个问题和那个escapeshellcmd无关。因为这个和linux对不同编码下面对php的参数理解不一样。
$cmd);
等同于执行系统命令行。不能用于检测命令是否执行成功。因为出错或者命令本身不产生输出,对于不产生输出的命令就无法检测是否执行成功。如果有这方面的要求,可以使用exec代替这个函数。
string exec ( string
$command[, array
&$output[, int
&$return_var]]
)
exec函数只会输出输出结果的最后一行,并不能完整的输出结果。推荐用system函数
把字符串转码为可以在 shell 命令里使用的参数
string escapeshellarg ( string
$arg)
shell 元字符转义
string escapeshellcmd ( string
$command)
escapeshellcmd() 对字符串中可能会欺骗
shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
passthru函数常用于输出图像。因为这个函数可以输出原始的二进制流信息。
如果想对执行一个命令比popen有更好的控制,那就是使用proc_open函数代替popen函数。主要是proc_open的参数更多。
所以对于进程命令的执行推荐使用proc_open.不过一般服务器为了防止意外,所以与系统有关的函数都是被禁止的。
proc_open相关函数的运用
http://www.cppblog.com/amazon/archive/2011/12/01/161281.aspx
http://blog.lifezq.com/pma/procopen.html
最后来讲一个使用这个系统函数escapeshellcmd过滤之后仍然会产生的一个漏洞:
php escapeshellcmd多字节编码漏洞解析及延伸
http://www.xfocus.net/articles/200805/979.html
试验过程:
正常情况下:
$e = escapeshellcmd($_GET['c']);
// here we don't care if $e has spaces
$result = system("echo
$e");
echo
$result;
在浏览器地址栏输入:xxxxx.php?c=loveshell%bf;id;
输出的结果是
loveshell乱码;id
如果加入一行代码putenv(“LANG=zh_CN.GBK");
// GBK编码下就会出问题
putenv("LANG=zh_CN.GBK");
$e = escapeshellcmd($_GET['c']);
// here we don't care if $e has spaces
$result = system("echo
$e");
echo
$result;
输出结果就是
lloveshell縗 uid=99(nobody) gid=4294967295 groups=4294967295
这个id命令就执行了。
这个问题和那个escapeshellcmd无关。因为这个和linux对不同编码下面对php的参数理解不一样。
相关文章推荐
- ZH奶酪:PHP遍历目录/文件的3种方法
- PHP关于表单提交 后 post get分页
- phpStorm8注册码
- FTP服务
- Yii的自带缓存的使用
- PHP Filter 函数
- PHP中$_SERVER的详细参数与说明
- ftp原理
- PHP magic_quotes_gpc的详细使用方法
- PHP动态特性一瞥
- [PHP] - Laravel - 修改laravel_session的cookie名称
- getsockname与getpeername用法与区别
- php通过变通方法检测系统的文件夹路径编码
- PHP 处理json中的中文
- live555学习笔记7-RTP打包与发送
- php查询whois信息的方法
- ThinkPHP单字母函数(快捷方法)使用总结
- java时间戳和PHP(mysql)时间戳
- 为什么getParameter会乱码
- Yii获取当前url和域名的方法