【问题标题】:Delete files outside of Web dir?删除 Web 目录之外的文件?
【发布时间】:2013-03-13 17:38:41
【问题描述】:

删除 web 目录之外的文件的解决方案是什么?它不会删除文件。

脚本将通过网络浏览器访问(仅限管理员)。

例如:

PHP 位于:/var/www/html/delete_xx_phones.php

-rwxr-xr-x 1 root root  592 Mar 13 17:18 delete_xx_phones.php

delete_xx_phones.php 代码如下所示:

 foreach(glob("/path/004*-phone.cf") as $file) { 
    unlink($file); 
  }

/path中的文件

-rw-r--r--  1 root root      346 Mar 13 17:15 004aaaa-phone.cf
-rw-r--r--  1 root root      346 Mar 13 17:15 004bbaa-phone.cf

【问题讨论】:

  • PHP 不关心 web-dir 但不太可能以root 运行,因此它可能没有足够的权限。
  • 您的脚本可能没有删除文件的权限 - 它们属于 root。对此没有简单的解决方法 - 您的实际情况是什么,为什么需要使用脚本来解决此问题?
  • @Pekka웃 因为每个 voip 电话都有一个 MAC 地址。文件存储在tftpboot 目录中 - 如果文件存在于“tftpboot”目录中,它将允许手机注册。当我在 linux 控制台上手动创建/删除文件时,它确实有效。我正在寻找解决方案以通过带有 PHP 的 Web 浏览器运行它

标签: php linux chmod delete-file


【解决方案1】:

PHP 脚本通常以非 root 用户身份运行,因为它们通常由 httpd 执行。由于您的文件被设置为仅对 root 用户具有写入权限,因此这是行不通的。

如果您无法永久更改文件的所有权或写入权限,您可以考虑编写一个非常短的脚本并使用提升的权限(使用sudo 或 suid 位)执行它,而不是在 PHP 上调用unlink()

对于 suid 方法,在 Perl 中编写一个简单的脚本(可能需要安装 perl-suidperl 包),删除作为参数传递的文件名:

删除文件.pl:

#!/usr/bin/perl -wT

# This is VERY insecure, so if you use it, make sure you modify it 
# to filter the filenames before putting the script on production
# machines
unlink $ARGV[ 0 ];

确保文件归根 (chown root delete-file.pl) 所有,然后运行 ​​chmod 6711 delete-file.pl 设置其 SUID 位。之后,该文件将始终以 root 身份执行。

然后在您的 PHP 脚本中,您只需运行 exec( "/path/delete-file.pl $filename" )(为安全起见,请考虑 shellescapearg()),您的文件应该会开始删除。

(请注意,我在这里专门使用 Perl,因为 Bash 传统上会忽略 suid 位。)

如果您对使用sudo 感觉更舒服,那么只需编写与上述类似的脚本(Bash 也可以)并将其添加到/etc/sudoers。然后,您可以执行以下操作:exec( "/usr/bin/sudo /path/to/delete-file-script $filename" ); 以提升权限运行脚本。

【讨论】:

  • 感谢您的建议。使用 PHP 脚本在控制台上执行怎么样?例如:exec( "/path/delete-file.php $filename" );
  • 这也应该是安全的,虽然我不认为你可以使用 suid bit。 sudoing PHP 非常好。
【解决方案2】:

PHP 无法访问这些文件,因为它们属于 root 用户。 PHP 通常以 Web 服务器的用户 ID 运行,或者如果它在命令行上运行,则在调用 php 的用户的上下文中。

理论上,您可以在 PHP 脚本中执行 sudo 来强制删除这些文件,但这是非常糟糕的做法 - 为此您必须将 root 密码存储在 PHP 脚本中。

更好的方法是将文件的所有者更改为 PHP 运行的用户,或者 chmod 将它们删除,以便 PHP 可以删除它们(尽管这也不是很优雅,因为你会让每个用户都可以访问文件在机器上)。

根据您的情况,每隔几分钟在root 帐户下运行并更改这些文件所有者的cron 脚本可能是一个可行的解决方案:

chown apache:apache /path/004*-phone.cf 

(用您的 PHP 用户和/或组替换 apache:apache

当然,如果您可以影响这些文件的创建方式,那么让它们立即成为正确用户的财产是理想的。

【讨论】:

    猜你喜欢
    • 2011-05-18
    • 2023-03-28
    • 2014-04-06
    • 2022-01-22
    • 2016-09-13
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多