将PHP脚本仅限制在其目录和子目录中

x7yiwoj4  于 2023-01-08  发布在  PHP
关注(0)|答案(1)|浏览(202)

我正在制作一个带有图片库的网站。我想尽可能少地做后端。我把图片分成文件夹。我有一个PHP脚本,它从get param.fetchFiles.php?dir=./art指定的目录中获取内容。Javascript在那里发送一个获取操作,它返回一个图片文件名的JSON数组,并创建带有src的图片。我希望有这样的PHP可以只访问目录中的东西,脚本在其中执行,所以有人不能访问服务器上的所有目录。
fetchFiles.php

<?php
    echo json_encode(
        array_values(
            array_diff(
                scandir($_GET['dir'], SCANDIR_SORT_ASCENDING),
                array('.', '..', 'fetchFiles.php')
            )
        )
    );
?>
l7wslrjt

l7wslrjt1#

首先,永远不要允许用户控制直接影响代码的输入,这种代码和用户提供的数据的混合正是导致代码不安全的原因。
不是让用户决定PHP应该查找哪个目录,而是让PHP决定它应该查找哪个目录。

代替:

scandir($_GET['dir'], SCANDIR_SORT_ASCENDING);

执行以下操作:

const PICTURES_DIR = '/path/to/pictures/';
scandir(PICTURES_DIR, SCANDIR_SORT_ASCENDING);

如果您必须让用户提供部分输入,至少可以使用Whitelisting方法,而不是让整个代码暴露于各种各样的漏洞。

$whiteList = ['/path1/', '/path2/', ...];

if (in_array($_GET['path'], $whiteList)) { // It's OK

} else { // Ohnoes :(

}

现在,PHP有一个叫做open_basedir的限制,它阻止PHP访问特定的基目录,但是如果你发现自己这么做只是因为太懒了,以至于允许任意用户输入来控制你的代码,你就已经为失败做好了准备。
安全性是层层构建的,它不是万能的。

相关问题