【问题标题】:Perl CGI PHP Session Permission DeniedPerl CGI PHP 会话权限被拒绝
【发布时间】:2012-01-11 21:35:27
【问题描述】:

我正在尝试将 PHP 会话变量放入 Perl CGI 脚本。我在下面有以下 perl 代码,它似乎可以让我获得 PHPSESSID,然后我将其传递给 PHP::Session 以及存储会话文件的目录。

my $cookie_name='PHPSESSID'; 
my $sess_query = new CGI;
my $session_name = $sess_query->cookie($cookie_name);
my $session = PHP::Session->new($session_name,{save_path =>'/var/lib/php/session/'});

当我收到权限被拒绝错误时,我的问题发生了

[Fri Dec 2 16:52:44 2011] upload.cgi: /var/lib/php/session/sess_417ar7qsh4sh853gqs3bj454i5: Permission denied at /var/www/html/xxx/upload.cgi line 22, referer:. ..

第 22 行是上面代码中的PHP::Session->new 行。

我的 httpd 服务器以 apache 用户身份运行,cgi 脚本由 apache 拥有,/var/lib/php/session/ 中的所有 sesssion 文件也是如此,所以我想知道为什么 CGI 脚本不能读取会话文件。

我在网上读到有人使用 LWP 作为解决方法,但这不是我的偏好,因为我觉得这对我缺少的权限很愚蠢。


更新:添加信息 - 这里是会话文件 - 你可以看到会话文件存在并且归 apache 所有,但 CGI perl 脚本无法读取这些:

-rw-------. 1 apache apache   0 Dec  2 16:58 /var/lib/php/session/sess_417ar7qsh4sh853gqs3bj454i5
-rw-------. 1 apache apache 126 Dec  2 16:58 /var/lib/php/session/sess_f39ot5ul3bu55uu7d1rg3aqq02

【问题讨论】:

  • /var/lib/php/session//var/lib/php/session/sess_417ar7qsh4sh853gqs3bj454i5的权限是什么?做一个ls -l 找出答案。另外,您的 perl CGI 以什么用户/组的身份运行?请记住,apache 配置可能会让您的 CGI 脚本以不同的用户身份运行。
  • 嗯...我可以验证 httpd 是否以 apache 用户身份运行,但是如果配置文件中的 CGI 脚本以其他用户身份运行,我在哪里可以找到?
  • 找出 CGI 运行的用户/组的最简单方法可能是 perl 变量 $<$>$($)。只需从您的 CGI 打印出来。尖括号是真实有效的用户id;括号是真实有效的组 ID。您必须查找 ID。
  • 我肯定没有将它设置为不同的用户,只是对 CGI 或 cgi 或 cgi-bin 的 conf 文件进行了 grep 处理,没有任何异常......
  • @Ross:只需print "Content-type: text/plain\n\n$< $> $( $)\n"; 无需复制所有变量。或任何复杂性。

标签: php perl session permissions cgi


【解决方案1】:

问题确实是 SELinux...在这种情况下,不是 1 个 AVC 警报,而是 5 个 - 一个警报对应于读取目录中文件所需的每个文件 I/O 操作。它们按顺序触发,但可以使用下面的 {} 语法来允许。

这可以通过以下方式解决:

allow httpd_sys_script_t httpd_var_run_t: dir search;
allow httpd_sys_script_t httpd_var_run_t: file { lock read ioctl open getattr};

谈论使用腰带和吊带!

感谢您的帮助!

R

【讨论】:

    【解决方案2】:

    ...所以我想知道为什么 CGI 脚本不能读取 会话文件。

    documentation 中写道:

    保存路径

        会话文件存储的目录路径。默认值:/tmp。

    我不认为你和这个模块正在考虑相同的会话文件。

    【讨论】:

    • 我已为您突出显示“存储”。如果您不喜欢,请随时恢复我的编辑。
    • 点击编辑,然后点击来源。或者,stackoverflow.com/revisions/… ...您的间距使它认为第二行是代码,所以我使用  而是。
    • 您好 - 默认是 /tmp,但是如果您查看我的构造函数,我将传递一个哈希数组以覆盖会话文件在我的特定机器上存储的目录的默认值。 Session 对象知道我想要做什么,但我被拒绝的权限阻止了......
    • @ross apache用户在这个目录有写权限吗?
    • 四个空格表示一个代码块。我相信与标签相同。但显然四  才不是。您不能在代码块中格式化。
    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多