检查以确定userA是否有权访问fileB(PHP)

检查以确定userA是否有权访问fileB(PHP),php,permissions,Php,Permissions,PHP有一个函数,用于检查脚本所有者是否可以读取文件。例如,是否有相应的脚本来查看文件是否可由指定用户读取 is_readable('Gavrilo Princip', 'black_hand.srj') 检查这个问题 PHP文件管理器 PHP统计 其中的示例适用于*nix系统。我不知道它是否也能在Windows主机上运行。通过这些,您可以获得文件的GID和UID 我不知道是否有PHP等价物可以让您获得特定系统用户的UID和/或GID。您可能需要手动获取该值并根据这些值进行搜索。您通常可以在

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

is_readable('Gavrilo Princip', 'black_hand.srj')
检查这个问题

PHP文件管理器

PHP统计

其中的示例适用于*nix系统。我不知道它是否也能在Windows主机上运行。通过这些,您可以获得文件的GID和UID

我不知道是否有PHP等价物可以让您获得特定系统用户的UID和/或GID。您可能需要手动获取该值并根据这些值进行搜索。您通常可以在/etc/passwd文件中找到该值。请检查此问题

PHP文件管理器

PHP统计

其中的示例适用于*nix系统。我不知道它是否也能在Windows主机上运行。通过这些,您可以获得文件的GID和UID


我不知道是否有PHP等价物可以让您获得特定系统用户的UID和/或GID。您可能需要手动获取该值并根据这些值进行搜索。通常可以在未内置的/etc/passwd文件中找到该值。我甚至不认为有一个命令行实用程序可以检查某个用户是否具有文件的读取权限


您可以编写自己的函数来执行检查。查看、、和函数。

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

您可以编写自己的函数来执行检查。查看、、和函数。

多亏了和的帮助,我想出了一个尚未测试过的解决方案。此解决方案在shell中实现,并等待来自标准的输入(设计用于使用apacherewritemap)。但是,它可以很容易地修改为从命令行或PHP脚本调用。它比必须的要复杂一点,因为我们正在将函数(
getfacl
)的输入管道化到
while
循环。当我们这样做时,它会启动一个新的supprocess,因此在这个循环中声明或更新的任何变量(即,
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
多亏了和的帮助,我想出了一个尚未测试过的解决方案。此解决方案在shell中实现,并等待来自标准的输入(设计用于使用apacherewritemap)。但是,它可以很容易地修改为从命令行或PHP脚本调用。它比必须的要复杂一点,因为我们正在将函数(
getfacl
)的输入管道化到
while
循环。当我们这样做时,它会启动一个新的supprocess,因此在这个循环中声明或更新的任何变量(即,
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

我不知道。您需要将权限保存在数据库中并从中读取。(我可能错了,这就是为什么我没有发布答案)检查这个问题:没有我知道的。您需要将权限保存在数据库中并从中读取。(我可能错了,这就是为什么我没有发布答案)检查这个问题:是的,我想我必须在所有三个所有者、组和其他人身上运行几个if条件,然后可能检查
/etc/passwd
是的,我想我必须在所有三个所有者、组和其他人身上运行几个if条件,然后可能检查
/etc/passwd
我应该提到我只对*nix系统感兴趣。Thanks@puk是的,使用
exec()
可以实现这一点,但不要这样做
exec()
的安全风险太大。如果您有权创建用户,则您有权查找他们的UID和GID。是否确实需要访问权限来创建用户?几乎任何人都可以读取文件权限(前提是他们对父目录具有读取权限),然后检查userA是否是所有者,或者是否在组中,或者文件是否可以被所有人读取。我知道这不是我最初的问题,但你知道类似于is_readable的内容是否会考虑ACL吗@puk我刚才说的是,php函数将为您提供文件所有者的UID和文件的GID,但无法将它们与特定用户名联系起来。因此,您需要能够访问/etc/passwd文件来表示“UserA”的UID是1000,属于gid1002。我的假设是,如果您有这些不同的系统用户,那么您可以创建它们,因此您可以访问/etc/passwdI。我应该提到,我只对*nix系统感兴趣。Thanks@puk是的,使用
exec()
可以实现这一点,但不要这样做
exec()
的安全风险太大。如果您有权创建用户,则您有权查找他们的UID和GID。是否确实需要访问权限来创建用户?几乎任何人都可以读取文件权限(前提是他们对父目录具有读取权限),然后检查userA是否是所有者,或者是否在组中,或者文件是否可以被所有人读取。我知道这不是我最初的问题,但你知道类似于is_readable的内容是否会考虑ACL吗@puk我刚才说的是php函数将为您提供文件所有者的UID