我正在尝试将GET查询的安全性添加到exec
函数。
如果删除escapeshellarg()函数,它可以正常工作。如何解决这个问题?
ajax_command.php
<?php
$command = escapeshellarg($_GET['command']);
exec("/usr/bin/php-cli " . $command);
?>
假设$_GET['command']
值为run.php -n 3
我还可以添加哪些安全检查?
答案 0 :(得分:6)
你想要escapeshellcmd
(转义整个命令,或者在你的情况下,转义参数序列)而不是escapeshellarg
(只转义一个参数)。
请注意,虽然您已采取特殊预防措施,但此代码允许任何人在您的服务器上执行任意命令,方法是在-r
选项中指定整个php脚本。请注意,php.ini
不能用于限制此操作,因为-c
可以覆盖它的位置。简而言之(并且误差范围非常小):此代码会产生严重的安全漏洞。
答案 1 :(得分:1)
escapeshellarg返回一个引用值,所以如果它包含多个参数,它将不起作用,而是看起来像一个stringesque参数。您可能应该将命令分成几个不同的参数,然后逐个转义。
答案 2 :(得分:1)
除非有名为run.php -n 3
的文件,否则它将失败。您不想转义单个参数,您想要转义文件名和参数。
这不是正确的方法。让一个PHP脚本为您运行所有命令,在命令行参数中指定所有命令。逃避参数并担心PHP文件中的安全性。
或者更好的是,通过管道进行沟通。