exec()安全性

时间:2011-07-08 11:27:30

标签: security exec php

我正在尝试将GET查询的安全性添加到exec函数。

如果删除escapeshellarg()函数,它可以正常工作。如何解决这个问题?

ajax_command.php

<?php
$command = escapeshellarg($_GET['command']);
exec("/usr/bin/php-cli " . $command);
?>

假设$_GET['command']值为run.php -n 3

我还可以添加哪些安全检查?

3 个答案:

答案 0 :(得分:6)

你想要escapeshellcmd(转义整个命令,或者在你的情况下,转义参数序列)而不是escapeshellarg(只转义一个参数)。

请注意,虽然您已采取特殊预防措施,但此代码允许任何人在您的服务器上执行任意命令,方法是在-r选项中指定整个php脚本。请注意,php.ini不能用于限制此操作,因为-c可以覆盖它的位置。简而言之(并且误差范围非常小):此代码会产生严重的安全漏洞。

答案 1 :(得分:1)

escapeshellarg返回一个引用值,所以如果它包含多个参数,它将不起作用,而是看起来像一个stringesque参数。您可能应该将命令分成几个不同的参数,然后逐个转义。

答案 2 :(得分:1)

除非有名为run.php -n 3的文件,否则它将失败。您不想转义单个参数,您想要转义文件名和参数。

这不是正确的方法。让一个PHP脚本为您运行所有命令,在命令行参数中指定所有命令。逃避参数并担心PHP文件中的安全性。

或者更好的是,通过管道进行沟通。