猿问

我该如何处理需要包含特殊字符的网址?

因此,最初我遇到了某些页面未加载的问题,因为 url 具有特殊字符,如 '、! 等,但 url 是根据文件夹名称创建的。如果用户上传的文件夹包含需要在回显时显示的特殊字符,如何将其从文件夹中删除但在显示链接时保留它?我在想,也许我不会给用户一个命名文件夹并直接使用 mkdir 创建的机会,而是将他们选择的文件夹名称上传到数据库并创建一个仅具有递增值的文件夹。我不知道这是否是一个好主意,或者我编写的代码是否有任何好处,所以我希望你们能给我一些建议,也许是一个解决方案?


<?php 

# Get Variables

$seriesGet = $_GET['series'] ?? "";

$chapterGet = $_GET['chapter'] ?? "";



$seriesDir = scandir("series/");


print_r($seriesDir);



echo "<br>";


# Display Series folders


if (!$_GET) {

    $arrayStart = 0;


    foreach ($seriesDir as $series => $value) {

        if ($seriesDir[$arrayStart] != "." && $seriesDir[$arrayStart] != "..") {

            echo "<a href='testScript.php?series=". $seriesDir[$arrayStart] ."'>". $seriesDir[$arrayStart] ."</a>";

        }

        echo "<br>";

        $arrayStart = $arrayStart + 1;

    }

}

echo "<br>";


# Display chapters in series folder


if ($seriesGet && !$chapterGet) {


    $chapterDir = scandir("series/" . $seriesGet . "/");

    $seriesPath = "series/$seriesGet";


    echo "<img src='$seriesPath/cover.jpg'>";

    readfile("$seriesPath/description.txt");


    echo "<br>";

    $array2Start = 0;

    foreach ($chapterDir as $series => $value) {

        if ($chapterDir[$array2Start] != "." && $chapterDir[$array2Start] != ".." && $chapterDir[$array2Start] != "cover.jpg" && $chapterDir[$array2Start] != "description.txt") {

            echo "<a href='testScript.php?series=". $seriesGet . "&chapter=" . $chapterDir[$array2Start] ."'>". $chapterDir[$array2Start] ."</a>";

        }

        echo "<br>";

        $array2Start = $array2Start + 1;

    }

}


# Display Images


if ($seriesGet && $chapterGet) {

    $dirname = "series/" . $seriesGet. "/" . $chapterGet . "/";


    print_r($dirname);


    $images = glob($dirname."*.{jpg,png}", GLOB_BRACE);


    foreach($images as $image) {

        echo '<img src="'.$image.'" /><br />';

    }

}


慕村9548890
浏览 102回答 2
2回答

慕工程0101907

要对 URL 中的保留实体(特殊字符)进行编码,请使用百分比编码。例如,感叹号!被编码为%21。对于您提到的字符,您可以查阅 ASCII 表来了解其值应该是什么。我在想,也许我不会给用户一个命名文件夹并直接使用 mkdir 创建的机会,而是将他们选择的文件夹名称上传到数据库并创建一个仅具有递增值的文件夹。是的,您绝对不应该让用户选择磁盘上文件的名称。如果您这样做并且不非常小心,则可能会受到一系列攻击。最常见的情况是用户上传可执行内容,或使用相对路径写入其他位置。例如,他们可能会上传something-evil.php,并且您的网络服务器可能配置错误,并且在访问 时实际上运行了他们的代码https://example.com/uploads/something-evil.php。或者,也许他们上传类似内容../../../../etc/init.d/evil-script并在您的服务器上运行。正如您所提议的那样,通过不允许用户控制文件名来完全避免问题更容易。只需确保它们无法覆盖其他文件,或者根本无法命名这些文件,即使它们位于另一个文件夹中。现在,让我们检查一下您的代码......$chapterDir = scandir("series/" . $seriesGet . "/");这很危险!用户指定要读取的路径。正如我上面所说,您实际上允许他们插入相对路径并读取 PHP 可以读取的任何内容。配置错误的 Web 服务器很常见,您不希望它们从存储中读取不应该读取的内容。echo "<a href='testScript.php?series=". $seriesDir[$arrayStart] ."'>"...切勿将任意数据连接到 HTML 上下文中!这里实际上存在多个问题。首先,您必须对 URL 中使用的任何内容进行 URL 编码。使用urlencode()。其次,您的数据不会针对 HTML 进行转义,因此某些数据可能会在某些脚本标记或其他内容中泄漏,甚至只是使您的 HTML 无效。使用htmlspecialchars()您注入到 HTML 中的任意数据,即使它是您自己的可信数据。您要将数据从一个上下文移动到另一个上下文,并且需要对其进行正确转义。

慕尼黑的夜晚无繁华

一个好的文件名约定会对你将来有好处。不要给用户太多的自由,在命名文件和文件夹时也可以遵循Window计算机的命名约定。
随时随地看视频慕课网APP
我要回答