列表F
total 90
-rw-r--r-- 1 user cust 611 Jul 17 2004 CHANGE
drwxr-xr-x 2 user cust 512 Jul 27 2004 cgi
drwxr-xr-x 5 user cust 512 Jan 27 2005 vhost
函数passthru()和exec()类似,除了一点,就是它在被调用时直接将原始的输出返回到浏览器。通常,这只有在你的外部命令的输出是原始二元数据,需要直接输入到解码器中的时候才有用——例如,一个音频流或图象。列表G举例说明了passthru()是如何起作用的。.
列表G
<?php
header("Content-Type: audio/wav"); // send MIME headers
passthru("cat hello.wav"); // send binary data
?>
潜在的弱点
通过PHP脚本执行外部命令始终是一个冒险的建议。如果你的应该程序允许用户输入,那么就会始终存在用户捉弄系统,执行有害命令的危险。为了避免这一点,可以有两种选择:
1.避开命令字符串
PHP提供了escapeshellcmd()和escapeshellarg()函数,这两个函数会利用引号和反斜线“清除”命令字符串和变量。在将任意的用户输入exec()、passthru()或反引号运算符之前,对它们运行这些命令是一个好办法。(列表H)
列表H
<?php
$cmd = "ls / -als & rm -rf /";
exec(escapeshellcmd($cmd));
?>
2.利用安全模式
另一个选择就是激活PHP的“安全模式”,来限制什么样的用户可以利用exec()和passthru()。反引号运算符在安全模式下是不可用的,而exec()和passthru()只能用来执行位于前面所定义的“安全”目录中的命令。这样就对这些命令提供了清晰的界限,并减少了与在脚本中使用它们相关的总风险。
但愿你现在应该对怎样从PHP内部启动外部程序有了一个清晰的看法,也对怎么样在使用这些性能时,保护你的应用程序免受黑客攻击有所了解。继续自己尝试它们吧……编程快乐!