将 PHP 脚本限制在其目录和子目录中
Restrict PHP script only to its directory and sub directories
我正在制作一个包含一些图片库的网站。
我想做尽可能少的后端。我将图像分成文件夹。我有一个 PHP 脚本,它获取由 get 参数指定的目录的内容。 fetchFiles.php?dir=./art
。 Javascript 向那里发送一个提取,它 returns 一个 JSON 图像文件名数组,并创建具有 src
个的图像。我想拥有它,以便 PHP 只能访问它正在执行的脚本目录中的内容,因此有人无法访问服务器上的所有目录。
fetchFiles.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);
如果您必须让用户提供部分输入,您至少可以使用 Whitelisting 方法,而不是仅仅将整个代码暴露给各种漏洞。
$whiteList = ['/path1/', '/path2/', ...];
if (in_array($_GET['path'], $whiteList)) { // It's OK
} else { // Ohnoes :(
}
现在,PHP 有一个叫做 open_basedir
的限制,可以防止 PHP 进入某个基目录之上,但实际上如果你发现自己这样做只是为了懒得允许任意用户输入来控制您的代码,您已经为失败做好了准备。
安全性内置于层。这不是灵丹妙药。
我正在制作一个包含一些图片库的网站。
我想做尽可能少的后端。我将图像分成文件夹。我有一个 PHP 脚本,它获取由 get 参数指定的目录的内容。 fetchFiles.php?dir=./art
。 Javascript 向那里发送一个提取,它 returns 一个 JSON 图像文件名数组,并创建具有 src
个的图像。我想拥有它,以便 PHP 只能访问它正在执行的脚本目录中的内容,因此有人无法访问服务器上的所有目录。
fetchFiles.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);
如果您必须让用户提供部分输入,您至少可以使用 Whitelisting 方法,而不是仅仅将整个代码暴露给各种漏洞。
$whiteList = ['/path1/', '/path2/', ...];
if (in_array($_GET['path'], $whiteList)) { // It's OK
} else { // Ohnoes :(
}
现在,PHP 有一个叫做 open_basedir
的限制,可以防止 PHP 进入某个基目录之上,但实际上如果你发现自己这样做只是为了懒得允许任意用户输入来控制您的代码,您已经为失败做好了准备。
安全性内置于层。这不是灵丹妙药。