微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 添加到sudoers.d的脚本不是以root身份执行的

在xubuntu框中,我有以下脚本让PHP创建我的用户拥有的目录:

<?PHP
if(!isset($_REQUEST['path'])) die('No path specified');
$path = $_REQUEST['path'];
$res1 = shell_exec("sudo mkdir -p $path");
$res2 = shell_exec("sudo chown -R majid:majid $path");
var_dump($res1, $res2);
?>

该脚本位于/var/www/path/to/mkdir.PHP

我还将此文件添加到/etc/sudoers.d/grantmkdir,其中包含以下内容

www-data ALL=(ALL:ALL) nopASSWD: /var/www/path/to/mkdir.PHP

我已将文件chmoded到0440.从浏览器访问mkdir.PHP,var转储的输出为NULL NULL,并且不创建任何目录.我究竟做错了什么?

解决方法:

你的设置有点混乱.

当您从浏览器访问此脚本时,apache会使用www-data用户启动它.

Sudo没有被执行.你不能让apache通过sudo调用你的脚本.
您必须将敏感脚本包装到sudo调用中.

例如这样:

创建两个脚本.第一个将由apache调用,第二个将由第一个通过sudo调用.

first.PHP

<?PHP
if(!isset($_REQUEST['path'])) die('No path specified');
$path = $_REQUEST['path'];
// By the way here you should verify the path! Otherwise malicIoUs users can make your system execute whatever they want...
shell_exec("sudo /var/www/path/to/second.PHP " . $path);
?>

second.PHP

#!/usr/bin/PHP
<?PHP
shell_exec("sudo mkdir -p " . $argv[1]);
shell_exec("sudo chown -R majid:majid " . $argv[1]);
?>

并使second.PHP可以通过sudo执行:

/etc/sudoers.d/second

www-data ALL=(ALL:ALL) nopASSWD: /var/www/path/to/second.PHP

这样apache将启动first.PHP,它将使用sudo启动second.PHP.

您可以测试sudo设置是否正常工作,登录到您的服务器,切换到www-data(su www-data).并手动运行脚本.

一些附注:

>检查错误日志可能很有用. (tail / var / log / apache / error_log或stg类似)
>不要忘记验证您的输入,否则您的系统将容易受到攻击.此问题的详细信息和解决方案:http://php.net/escapeshellarg
> NULL NULL可以正常.详情:http://php.net/shell_exec

Note:

06003

failures using this function. exec() should be used when access to the
program exit code is required.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐