使用php从linux访问windows共享文件夹

时间:2011-10-19 00:47:52

标签: php security

我需要能够使用在Linux服务器上运行的php脚本访问许多Windows服务器上的某些共享文件夹。我只需要获取文件夹中包含的文件的名称以及创建它们的时间戳。

到目前为止,我提出的唯一解决方案是在Linux中安装共享并从那里访问它。虽然这解决了这个问题,但我必须以root身份(据我所知)这意味着我要么以root身份运行脚本,这只是简单的愚蠢,或者手动挂载所有共享这将是一个严重的痛苦从长远来看管理。

这导致两个问题。

  1. 有人知道更好的方法吗?如果需要,我对所有机器都拥有管理权限。
  2. 我必须处理哪些安全问题?我需要克服根本问题,我需要保证linux / php脚本无法编辑/删除Windows机器上的文件,但我想可能存在的问题比那些潜伏在黑暗中的问题还多。

1 个答案:

答案 0 :(得分:2)

有数百台服务器进出频率足够高,编辑/etc/fstab添加新文件系统肯定是一个烦人的约束。

如果您所做的只是在服务器上列出文件和修改时间,那么smbclient(1)命令是一个很好的起点。 smbclient(1)很像SMB和CIFS共享的FTP接口。 -c命令行选项允许您运行特定命令;类似的东西:

smbclient //$servername/$sharename -c "dir path/to/directory/"

如果您要对文件执行更多操作而不仅仅列出修改时间,那么将共享作为文件系统挂载将减少连接和身份验证请求的数量,并且可能使解析stat(2)输出变得更加容易而不是解析数据的纯文本表示。

如果您想沿着安装文件系统的路线走下去,请首先拆分脚本。

一小部分应该使用服务器名,共享路径和可选的装载路径;它将(服务器,共享,路径)添加到/etc/fstab

这部分可以是setuid root。 (这很危险,但是以root身份运行整个PHP脚本。)

或者,您可以使用acl(5)支持挂载文件系统并添加新的访问控制条目:

mount / -oremount,acl
setfacl -m www::rw /etc/fstab

现在www用户有权修改/etc/fstab文件。 (请注意,在使用ACL为用户提供addmntent(3)的写入权限时,我实际上没有测试/etc/fstab。)请务必修改/etc/fstab以始终挂载/ acl支持,因此可以重新启动。

您可以使用addmntent(3) C库函数向/etc/fstab添加新条目。如果你打算使用setuid root可执行文件,我会选择C语言,而且我可能会用脚本语言选择C,因为addmntent(3)已经知道如何编写正确格式化的挂载条目/etc/fstab

包括usernoauto选项,以便您的脚本可以运行非特权,并且仍然可以根据需要安装共享。