【问题标题】:How to identify directory level-up matching root in regex?如何在正则表达式中识别目录升级匹配根?
【发布时间】:2019-08-21 16:03:20
【问题描述】:

我正在创建一个简单的文件管理器,它扫描目录并列出其中的文件和目录,包括升级的三个点../。我的“根”目录是E:/wamp/www,我不希望它允许我访问父目录。

我正在使用以下正则表达式:

(^E\:\/wamp\/www\/)(\.\.\/$|\.\.\/.*?(\.\.\/)+$)|(^E\:\/wamp\/www\/([^\/]+\/)+)(\.\.\/.*?(\.\.\/)+)

为了防止以下情况:

  1. E:/wamp/www/../
  2. E:/wamp/www/dir/../../
  3. E:/wamp/www/dir/subdir/../../../

但我发现也可以这样做:

  • E:/wamp/www/dir/../dir/../../

等等

如何防止这种情况发生并将其限制为仅在 E:/wamp/www 发生时使用正则表达式?

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    您可以使用realpath()函数:realpath

    来自文档:

    realpath() 扩展所有符号链接并解析输入路径中对 /./、/../ 和额外 / 字符的引用,并返回规范化的绝对​​路径名。

    不要仅仅依靠您的代码来防止将文件写入不应写入的位置,请为您的目录设置适当的权限。

    【讨论】:

    • 这是一个很好的解决方案,但我担心它可能会阻止访问子目录的父目录,因为如果我理解正确它会删除所有../,我也必须为此使用正则表达式
    • 它不会删除../,它会解决它们。例如:realpath('C:\xampp\htdocs\drought\images\..\images\..\..\drought') 给我C:\xampp\htdocs\drought
    • 但你仍然可以这样做:realpath('C:\xampp\htdocs\drought\images\..\images\..\..\drought\..\..\') 这样的事情不行吗?
    • @user11247237 你可以使用这个函数的输出并验证它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多