0

在 php 中,我执行以下操作:

exec('remove_file.sh', $output, $return);

其中 remove_file.sh 是以下脚本:

#!/bin/sh
rm -f /tmp/test.pdf

我验证了这个脚本是由 www-data 运行的,并且 test.pdf 由 myuser 拥有,但具有 666 (rw-rw-rw-) 权限。/tmp 归 root 所有,拥有 666 权限。

该脚本返回 1(一般错误)而没有任何输出。

如果我从终端尝试:

sudo su www-data -c 'rm -f /tmp/test.pdf'

我得到:

cannot remove `/tmp/test.pdf': Operation not permitted

如何从 php 脚本中删除此文件?

4

1 回答 1

2

您可能必须确保www-user对目录以及文件具有写权限。这取决于文件系统,但大多数操作都需要rmmv

所以chmod 777 /tmp应该做的伎俩。

编辑:以上可能不是实现所需可用性的安全方式。根据您的设置,完成此操作的更彻底的方法是添加www-userusers组(假设myuser主要组是users),然后将/tmp目录设置为 rwx 用于用户和组。

# usermod -g users www-user
# chmod 770 /tmp

允许每个人在其中读取、写入和执行/tmp不适合多用户或不安全的盒子,虽然它可能在安全良好的服务器上正常工作,但您为任何破坏盒子的人提供了很多访问权限。

一个更好的选择是让 php 将文件上传到更本地的目录,而不是使用$_FILES使用 bash 脚本,然后再次使用 PHP 通过unlink删除它们。这样所有文件都属于www-user. 请记住,必须在允许上传之前彻底验证文件,以防止通过c99 和类似恶意软件进行攻击。

编辑(来自OP):

虽然安全问题不适用于我的情况,但我完全同意之前的编辑。使用 /tmp 是一种懒惰的方法。但真正的问题是我在自己的用户下测试了创建文件,然后从 www-data 继续测试。在 /tmp 的默认权限下,您不能(正确地)删除另一个用户文件,也不能覆盖它。这导致了各种问题,不仅是 rm。

于 2013-04-22T09:06:18.347 回答