【问题标题】:cgi script can't write to world writable file under apachecgi脚本无法写入apache下的世界可写文件
【发布时间】:2023-03-18 18:55:02
【问题描述】:

我正在尝试使用 CentOS 7、Apache 2.4 和 Ruby 2.0 创建一个简单的 CGI 脚本。从官方包安装的所有工具。

我的脚本,位于/var/www/cgi-bin/test.cgi 是:

#!/usr/bin/ruby

puts "Content-Type: text/plain\n\n"
begin
    file = File.open("test.log", "a")
    file.puts("foobar")
    file.close
rescue Exception
    puts "pwd: #{`pwd`}"
    puts $!.inspect
end

当我加载 http://myhost/cgi-bin/test.cgi 时,我得到以下信息:

pwd: /var/www/cgi-bin
#<Errno::EACCES: Permission denied - test.log>

但是:

[root@host cgi-bin]# ls -l /var/www/cgi-bin
total 8
-rwxr-xr-x. 1 root root 153 Jul 10 22:03 env.cgi
-rwxr-xr-x. 1 root root 359 Jul 11 00:45 test.cgi
-rw-rw-rw-. 1 root root   0 Jul 11 00:42 test.log

如果不能将数据从这个 cgi 脚本中写入脚本自己的工作目录中的全局可写文件,我如何(以及在​​哪里)写入数据?

【问题讨论】:

  • Sinatra 之类的东西存在时,我不确定您为什么要使用 1990 年代风格的 CGI 启动器。强烈建议完全避免 CGI,因为它具有深远而可怕的安全隐患。
  • 这些文件归 root 所有,可能是运行 CGI 脚本的用户(可能是您的 HTTP 服务器默认用户)无法访问该目录。
  • 使用 1990 年代风格的 CGI,因为我认为它比设置 sinatra 更快,这是一个一次性项目。从字面上看,一个带有单个表单的页面,在提交时需要将其参数记录到一个平面文件中。不过会检查路径中更高级别目录的权限。
  • 作为我的非 root 用户,我可以附加到 /var/www/cgi-bin/test.log。我认为 httpd 运行为“apache”。
  • 看起来是 SELinux。 “setenforce Permissive”并且脚本能够写入文件。

标签: ruby apache cgi centos7 apache2.4


【解决方案1】:

SELinux 正在阻止文件写入。 “setenforce Permissive”允许他们通过。编辑 /etc/sysconfig/selinux 并重新启动以使其永久化。

【讨论】:

  • SELinux 总是会毁了你的一天,这是真的。
猜你喜欢
  • 2010-09-07
  • 2012-08-26
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2018-02-22
  • 2016-01-28
相关资源
最近更新 更多