我正在制作一个带有一些图片库的网站。 我想做尽可能少的后端。我将图像分成文件夹。我有一个 PHP 脚本,可以获取由 get 参数指定的目录的内容。fetchFiles.php?dir=./art
.Javascript 在那里发送一个获取,它返回一个图像文件名的 JSON 数组,并创建具有src
的图像。我希望拥有它,以便 PHP 只能访问它正在执行脚本的目录中的内容,因此有人无法访问服务器上的所有目录。
获取文件.php
<?php
echo json_encode(
array_values(
array_diff(
scandir($_GET['dir'], SCANDIR_SORT_ASCENDING),
array('.', '..', 'fetchFiles.php')
)
)
);
?>
首先,永远不要允许用户控制直接影响代码的输入。这种代码和用户提供的数据的混合正是导致代码不安全的原因。
与其让用户决定你的 PHP 应该在哪个目录中查找,不如让 PHP 决定它应该在哪个目录中查找。
而不是:
scandir($_GET['dir'], SCANDIR_SORT_ASCENDING);
这样做:
const PICTURES_DIR = '/path/to/pictures/';
scandir(PICTURES_DIR, SCANDIR_SORT_ASCENDING);
如果您必须让用户提供输入的某些部分,您至少可以做的是使用白名单方法,而不仅仅是向各种漏洞开放整个代码。
$whiteList = ['/path1/', '/path2/', ...];
if (in_array($_GET['path'], $whiteList)) { // It's OK
} else { // Ohnoes :(
}
现在,PHP 有一个叫做open_basedir
限制的东西,它阻止 PHP 能够超越某个基目录,但实际上,如果你发现自己这样做只是为了懒惰,以至于允许任意用户输入来控制你的代码,你已经在为失败做准备。
安全性是分层构建的。这不是灵丹妙药。