在尝试在根目录.envfile
中创建名为/
的文件时,我遇到了perl错误(仅适用于 UNIX )。权限被拒绝,这是理解的。但是,有没有办法写这个文件?我需要在没有任何模块的情况下完成它,只需要内置函数。我希望使用chmod
,但是......老实说,不知道如何在SAFELY中在同一个线程中实现它。
我需要这个文件在我的软件中写入我自己的ENVs(因为它是一个有很多目录的大项目,需要与许多自己的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.
任何帮助表示赞赏! 谢谢!
答案 0 :(得分:2)
手动创建文件并将其所有者设置为apache进程的所有者,例如:
sudo touch /.envfile sudo chown www-data:www-data /.envfile sudo chmod u+rw /.envfile
答案 1 :(得分:2)
如果我正确理解了这个问题,您似乎还可以控制最终会读取您尝试创建的文件的软件。那是准确的吗?如果是这样,更改程序以从其他地方获取其环境。还有哪里?最好是一个新目录,以便您可以使Web服务器对其进行写入而不会影响其他任何内容。我可能会使用/etc/myprogram
(因为/etc
是配置文件的标准位置)或/var/local/myprogram
(因为/var
是持久数据文件的标准位置)。但不是现有的目录,而且只能由root保持可写。
如果不利用安全漏洞,Perl不允许您回避文件系统安全性(权限)。这是一件好事。如果允许,则意味着任何在您的Perl代码中发现漏洞的人都可以更改您计算机上的任何文件,可能会将其替换为有史以来最恶意的代码。
因此,Perl可以在/
中创建文件的唯一方式是,如果它以root身份运行,或者使用su
/ suid
来运行某些文件其他程序作为root。并且你真的,真的,真的,不希望CGI脚本或web应用程序以root身份运行,因为除非你在代码中完全完成所有操作,并且perl
本身,apache或内核中没有可利用的错误然后,通过以root身份运行您的Web代码,您可能会将root访问权交给互联网上的任何随机脚本小子。
如果你真的,真的,除了让网络可访问的代码将任意文件写入/
之外别无选择,那么最不好,最不安全的方法就是创建一个非常糟糕的微小的帮助程序,它将文件名和文件内容作为输入,检查以验证指定的文件是否已经存在(以便攻击者不能使用它来覆盖,比如你的内核),然后创建带有提供内容的命名文件。除了可能进行一些额外的健全/安全检查之外,它应该绝对没有别的,因为这个帮助程序越复杂,就越有可能包含可利用的漏洞。然后让Web代码使用suid
来运行帮助程序,并将suid
配置为允许Web用户(以及仅 Web用户)运行帮助程序(和仅帮助程序)没有密码。
但除非你真的,真的,绝对别无选择,否则不要这样做。它不是最好的方式,它是最不好的方式。这意味着它仍然是一个坏主意。
答案 2 :(得分:1)
您正在以没有足够权限的用户身份执行Perl程序。使用具有足够权限的用户运行Perl程序(例如,使用sudo
或su
)。