如何使用 perl 在根目录中创建文件?

How to create a file in the root dir with perl?

我在尝试在根目录 / 中创建名为 .envfile 的文件时遇到 perl 错误(仅适用于 UNIX)。许可被拒绝,这是可以理解的。但是,有没有办法写这个文件?我需要在没有任何模块的情况下完成它,只需要一个内置函数。我希望使用 chmod,但是...老实说,不知道如何在同一个线程中安全地实现它。

我需要这个文件来为我的软件编写我自己的 ENV(因为这是一个有很多目录的大项目,需要使用很多自己的 ENV 来运行)。

尝试简单:

my $filename = '.envfile';

open FH, '>', $filename or die $!;

print FH "some data\n";

close(FH);

Apache 说:Permission denied at /var/www/cgi-bin/env.cgi line 41.

感谢任何帮助! 谢谢!

创建文件 'by hand' 并将其所有者设置为 apache 进程的所有者,例如:

sudo touch /.envfile
sudo chown www-data:www-data /.envfile
sudo chmod u+rw /.envfile

您正在以没有足够权限的用户身份执行 Perl 程序。 运行 Perl 程序使用具有足够权限的用户(例如使用 sudosu)。

如果我对问题的理解正确,那么您似乎还控制了最终将读取您尝试创建的文件的软件。那是准确的吗?如果是这样,更改程序以从其他地方获取其环境。还有什么地方?最好是一个新目录,这样您就可以在不影响任何其他内容的情况下使其可由您的 Web 服务器写入。我可能会使用 /etc/myprogram(因为 /etc 是配置文件的标准位置)或 /var/local/myprogram(因为 /var 是持久数据文件的标准位置)。但不是 并且应该保持 只能由 root 写入的现有目录。

除了利用安全漏洞外,Perl 不允许您回避文件系统安全(权限)。这是一件好事。如果允许,则意味着任何在您的 Perl 代码中发现漏洞的人都可以更改您计算机上的任何文件,并有可能用有史以来最恶意的代码替换它。

因此,Perl 在 / 中创建文件的 唯一 方式是 运行 作为 root 或使用 su/suid 到 运行 一些其他程序作为 root。而且你真的,真的,真的不希望 CGI 脚本或 Web 应用程序 运行 以 root 身份运行,因为除非你在代码中绝对完美地完成所有事情,并且 perl 本身没有可利用的错误,或者apache 或内核,然后,通过 运行 将您的 Web 代码设置为 root,您可能会将 root 访问权限交给互联网上的任何随机脚本小子。

如果你真的、真的、绝对别无选择,只能让网络可访问的代码将任意文件写入 /,那么最不坏、最不安全的方法就是创建一个非常小的帮助程序,它将文件名和文件内容作为输入,检查以验证命名文件是否已经存在(这样攻击者就不能用它来覆盖,比如说,你的内核),然后创建具有提供内容的命名文件。除了可能有点额外的 sanity/security 检查外,它应该 绝对不会做任何其他事情 因为这个帮助程序越复杂,就越有可能包含可利用的缺陷。然后让网络代码使用 suid 到 运行 帮助程序,suid 配置为允许网络用户(并且 网络用户) 运行 没有密码的帮助程序(和 帮助程序)。

但是不要那样做,除非你真的、真的、绝对别无选择。这不是最好的方法,而是最不坏的方法。这意味着它仍然是一个坏主意。