猿问

将 PHP 脚本仅限于其目录和子目录

我正在制作一个包含一些图片库的网站。我想做尽可能少的后端。我将图像分成文件夹。我有一个 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')

            )

        )

    );

?>


茅侃侃
浏览 117回答 1
1回答

BIG阳

首先,永远不要让用户能够控制直接影响您的代码的输入。这种代码和用户提供的数据的混为一谈正是导致代码不安全的原因。与其让用户决定你的 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 超出某个基本目录,但实际上,如果您发现自己这样做只是为了懒得允许任意用户输入来控制您已经设置的代码自己失败。安全性是分层构建的。这不是一颗银弹。
随时随地看视频慕课网APP
我要回答