【问题标题】:Mapping a filesystem without using scandir() or readdir不使用 scandir() 或 readdir 映射文件系统
【发布时间】:2012-08-14 08:24:50
【问题描述】:

我有各种文件夹和文件,我想使用 PHP 进行映射。 将它们存储在数据库中并不是真正的选择,它们必须存储在 Windows 文件系统上。

不幸的是,由于驱动器的限制(它是一个网络驱动器)。我无法使用 scandir() 和 set_include_path(),因为我收到“open_basedir 限制生效”错误消息。我无法解决这个问题,因为我无法访问允许我在安全属性中添加 IIS_IUSR 的安全权限。 我应该补充一点,作为普通用户,我对驱动器上的所有内容具有完全的读/写权限。

我需要一个在 PHP 要求时运行的工具,而不是按计划运行的工具。

我考虑过的一种方法是使用用 C# 编写的服务,并在需要时让 PHP 调用它。我只是不确定如何将它们粘合在一起。

如果有人对如何做到这一点有更好的建议,请说。

【问题讨论】:

  • opendirreaddir 怎么样?
  • 你能exec()吗?您还在 Web 服务器 SAPI 或 CLI 下运行吗?另外,您需要文件中的哪些信息?您需要读取文件数据,还是只获取文件夹列表?您需要文件大小、修改时间等信息吗?
  • 不幸的是,与 readdir 的限制相同。
  • 看看@BerryLangerak 写了什么。

标签: php windows iis filesystems


【解决方案1】:

如果您对可以遍历的路径有限制(例如 open_basedir),则无法读取该目录之外的内容,因此您必须改用“外部”的东西。由于您使用的是 Windows,而我在该操作系统上几乎没有经验,因此我会选择最简单的解决方案:只需调用“dir”程序。我认为这可能有效,但不幸的是,我无法对其进行测试:

<?php
$output = `dir /s C:\directory\to\traverse`;

var_dump( $output );

【讨论】:

  • 难以置信。这不是安全问题吗?
  • @pete 视情况而定。如果你真的可以调用 exec(),就会假设 PHP 运行的用户是有限的。只是可能没有 open_basedir 限制那么有限。无论哪种方式,我都不认为这是 PHP 中的安全问题 :)
  • @BerryLangerak 谢谢。我不太了解 Windows 安全性,但它看起来很奇怪。
  • one would assume that the user PHP is running under is limited anyway - 永远不要假设。尤其是这样的事情,许多托管服务器管理员都是白痴。相信我。应该注意的是,dir 的限制是目标目录必须是可访问的,因为它是本地目录(即映射为网络驱动器)-\\server\share UNC 路径不起作用(即使来自 cmd) .另请注意,当shell_exec() 被禁用时,反引号不起作用。
  • @DaveRandom 啊,我自然会假设在一个称职的服务器管理员的上下文中。然而,如果它不受限制,它会让他更更容易完成他想做的事情。如果 shell_exec 被禁用,获取文件列表的唯一方法是致电服务器管理员并要求他提供解决方案;)
猜你喜欢
  • 2012-01-31
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2013-08-19
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多