【问题标题】:Reading/writing files outside DocumentRoot with apache and perl使用 apache 和 perl 在 DocumentRoot 之外读取/写入文件
【发布时间】:2015-01-22 19:50:42
【问题描述】:

我有一个由其他人编写的 perl cgi 脚本,我试图在没有真正理解它的情况下进行维护。从 apache 运行的脚本中的以下代码应该从文件中读取字符串,但它会因权限被拒绝错误而失败。

这是在带有 perl-5.18.4 和 apache-2.4.10 的 fedora20 系统上。

$changepass_dir 的值是 /var/changepass_temp,它归 apache.apache 所有。如果我suapache 用户,我可以读取/var/changepass_temp 中的$value{'username'}.fail 文件就好了。

但是,当直接从 apache 运行时,它会打印 OOPs /var/changepass_temp user1 -- Permission denied

if(-e "$changepass_dir/$value{'username'}\.fail"){

                    &login_fail($value{'username'},$value{'ip'});
                    open(IN,"$changepass_dir/$value{'username'}\.fail") || print ("OOPs $changepass_dir $value{'username'}  -- $!");
                    my $message = join('',<IN>);
                    unlink("$changepass_dir/$value{'username'}.fail");
                    &print_error($message);
                    last;
 }

整个脚本长达数百行,所以我认为发布整个内容不合适。希望这里有足够的信息来确定为什么这是一个问题?

谢谢, 亚历克斯

【问题讨论】:

  • 我还要提一下 selinux 目前已禁用。
  • 我还应该提到apache产生的错误消息是:[Thu Jan 22 00:18:56.261500 2015] [cgi:error] [pid 569] [client 68.195.193.42:57097] AH01215: [Thu Jan 22 00:18:56 2015] changepass.cgi: readline() on closed filehandle IN at /var/www/mail.example.com-443/html/changepass.cgi line 395., referer: https://webstage.example.com/changepass.cgi

标签: apache perl


【解决方案1】:

您的代码看起来不错,我认为问题不在于那里。您在日志中收到该错误的原因是因为 open 失败 - 而是打印错误 - 但是您的脚本继续过去并仍然尝试从它无法访问的文件中读取数据。 (这可能不是一件好事,因为它会在没有处理它的情况下删除文件)。

这将与权限相关。

因为您的 -e 测试有效(文件存在),这意味着您确实拥有一些权限,并且正在寻找正确的位置。这意味着您可能可以比较该目录的访问权限,看看是否有任何差异。

根据您目前所提供的内容,我的最佳猜测是您的脚本没有apache 运行。进一步降低脚本权限以避免利用条件的情况并不少见。

测试方法 - 一个简单的 ps 可能会成功,但您也可以尝试添加:

open ( my $tmp_file, ">", '/tmp/test_file' ) or warn $!; 

检查文件是否已创建,以及文件的所有者。

【讨论】:

  • 我尝试了你的 open() 测试,它不仅没有打印错误,而且没有创建文件。我确信它会专门执行该代码块,因为我创建了独特的文本来识别产生的其他错误消息。还有另一个进程创建该进程读取的文件。它可能与此有关吗?也许是某种类型的锁定问题?
  • 我添加了touch /var/changepass_temp/myfile(带有反引号),它也未能创建文件或给出任何警告/错误消息。该目录有 777 个权限,归 apache 所有。是否有其他一些 apache 设置可以控制守护进程写入文件的位置和方式?
  • 该警告应该在您的日志中给出错误。但它可能是permission denied :)
  • 如果我可以以该用户身份写入该文件,是否仍然存在权限被拒绝问题?什么会阻止它写入/tmp?还是 /var/tmp?
  • 其实/var/tmp 有一个相关的问题可能适用。 securityblog.redhat.com/2014/04/09/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多