检查以确定用户是否有权访问文件(PHP)

时间:2012-03-21 16:32:10

标签: php permissions

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

检查此问题 Check file permissions

PHP fileperms http://php.net/manual/en/function.fileperms.php

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

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

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

答案 2 :(得分:0)

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

#!/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