我正在建立一个带有一些图片库的网站。我想做尽可能少的后端。我将图像分成文件夹。我有一个PHP脚本,可获取由get参数指定的目录的内容。 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')
)
)
);
?>
而不是:
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进入某个基本目录之上,但实际上,如果您发现自己这样做很懒,以至于允许任意用户输入来控制代码,您已经为失败做好了准备。
安全性内置于layers中。这不是银弹。