我正在制作一个包含一些图片库的网站。我想做尽可能少的后端。我将图像分成文件夹。我有一个 PHP 脚本,它获取由 get 参数指定的目录的内容。fetchFiles.php?dir=./art. Javascript 在那里发送一个 fetch,它返回一个图像文件名的 JSON 数组,并使用srcof 创建图像。我想拥有它,以便 PHP 只能访问它正在执行的脚本目录中的东西,所以有人不能访问服务器上的所有目录。fetchFiles.php<?php echo json_encode( array_values( array_diff( scandir($_GET['dir'], SCANDIR_SORT_ASCENDING), array('.', '..', 'fetchFiles.php') ) ) );?>
1 回答
BIG阳
TA贡献1859条经验 获得超6个赞
首先,永远不要让用户能够控制直接影响您的代码的输入。这种代码和用户提供的数据的混为一谈正是导致代码不安全的原因。
与其让用户决定你的 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 超出某个基本目录,但实际上,如果您发现自己这样做只是为了懒得允许任意用户输入来控制您已经设置的代码自己失败。
安全性是分层构建的。这不是一颗银弹。
- 1 回答
- 0 关注
- 116 浏览
添加回答
举报
0/150
提交
取消