【问题标题】:Check to determine if userA has access to fileB (PHP)检查以确定用户是否有权访问文件 (PHP)
【发布时间】:2012-04-06 05:20:14
【问题描述】:

PHP 有一个is_readable 函数,它检查文件是否可以被脚本的所有者读取。是否有对应的脚本来查看文件是否可以被指定用户读取,例如

is_readable('Gavrilo Princip', 'black_hand.srj')

【问题讨论】:

标签: php permissions


【解决方案1】:

检查这个问题 Check file permissions

PHP 文件权限http://php.net/manual/en/function.fileperms.php

PHP 统计http://www.php.net/manual/en/function.stat.php

其中的示例适用于 *nix 系统。我不知道它是否会在 Windows 主机上运行相同。有了这些,你就可以得到文件的 GID 和 UID。

我不知道是否有可以让您获得特定系统用户的 UID 和/或 GID 的 PHP 等效项。您可能需要手动获取并搜索这些值。您通常可以在 /etc/passwd 文件中找到该值

【讨论】:

  • 我应该提到我只对 *nix 系统感兴趣。谢谢
  • @puk 是的,有很多方法可以使用exec(),但不要这样做。 exec() 的安全风险太大。如果您有权创建用户,则您有权查找他们的 UID 和 GID。
  • 您确定需要访问权限才能创建用户吗?几乎任何人都可以读取文件权限(前提是他们对父目录具有读取权限),然后您检查 userA 是否是所有者,或者在组中,或者文件是否可供所有人读取。
  • 我知道这不在我最初的问题中,但你知道 is_readable 之类的东西是否会考虑 ACL 吗? beginlinux.com/server_training/server-managment-topics/…
  • @puk 我的意思是 php 函数会给你文件所有者的 UID 和文件的 GID,但无法将它们与特定的用户名联系起来。所以你需要能够访问 /etc/passwd 文件来说明“UserA”的 UID 是 1000 并且属于 GID 1002。我的假设是,如果你有这些不同的系统用户,那么你就能够创建它们因此您可以访问 /etc/passwd
【解决方案2】:

不是内置的。我什至不认为有一个命令行实用程序可以检查某个用户是否具有文件的读取权限。

您可以编写自己的函数来进行检查。查看fileperms()fileowner()filegroup()posix_getpwuid() 函数。

【讨论】:

  • 是的,我想我必须对所有三个所有者、组和其他人运行几个 if 条件,然后可能检查/etc/passwd
【解决方案3】:

感谢ChrisAndrewR 的帮助,我想出了一个尚未经过测试的解决方案。该解决方案在 shell 中实现,并等待来自标准输入(旨在与 Apache RewriteMap 一起使用)的输入。但是,它可以很容易地修改为从命令行或 PHP 脚本调用。它比实际情况要复杂一些,因为我们将函数 (getfacl) 的输入通过管道传输到 while 循环。当我们这样做时,它会启动一个新的 suprocess,因此在这个循环中声明或更新的任何变量(即result)将不会对外界可用。此外,我使用了getfacl,因为我以后可以将其扩展为也可以使用 ACL 权限。最后,为了实现的原因,我在调用这个脚本之前已经知道文件的所有者(user),但是如果不是这样,可以从getfacl命令中轻松找到。

#!/bin/bash

#USAGE: STDIN viewer:user:file

while read line
do
   viewer=`echo $4 | cut -d ':' -f 1`
   user=`echo $4 | cut -d ':' -f 2`
   file=`echo $4 | cut -d ':' -f 3`

   result=$(
      getfacl $file 2>/dev/null | while read line
      do
         if [[ $user == $viewer ]] && [[ $line =~ ^user: ]]
         then
            permissions=`echo $line | cut -d ':' -f 3`
            if [[ $permissions =~ r ]]
            then
               echo true
               break
            fi
         elif [[ $user == $viewer ]] && [ $line =~ ^group: ]]
         then
            #NOTE: I take advantage of the fact that each user has one single group and that group has the same name as the user's name
            permissions=`echo $line | cut -d ':' -f 3`
            if [[ $permissions =~ r ]]
            then
               echo true
               break
            fi
         elif [[ $line =~ ^other: ]]
         then
            permissions=`echo $line | cut -d ':' -f 3`
            if [[ $permissions =~ r ]]
            then
               echo true
               break
            fi
         fi
      done
   )

   if [[ $result == "true" ]]
   then
      echo true
   else
      echo false
   fi
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多