【问题标题】:How to use "?main=" in HTML / PHP如何在 HTML / PHP 中使用 "?main="
【发布时间】:2021-11-07 16:07:15
【问题描述】:

我试图从我的根文件夹的子目录中引用一个文件,而这种方式只有“主”发生变化。

我的 home.php 文件中有这段代码:

<div id="main" class="main">
        <?php require $_GET['main'] . ".php"; ?>
    </div>

所有导航按钮都应将“main”更改为包含 home.php 的文件夹下的各个文件夹中的某些文件。

如果我引用的文件与我的工作文件位于同一文件夹中,则以下代码 sn-p 可以完美运行:

<a href="?main=dashboard.php">Dashboard 1</a>

我想做的是(我想)像这样:

<a href="?main=folder/dashboard.php"> Dashboard 1</a>

我引用的文件在不同的文件夹中。

另外,如果我引用有问题的文件

<a href="folder/dashboard.php"> Dashboard 1</a>

文件加载,但它不像?main=那样以“main”为目标

我尝试了无数我读到的方法/虽然会奏效,但到目前为止没有任何效果。任何帮助将不胜感激。

【问题讨论】:

  • 第一:未经验证不要这样做。因为可以注入任何路径。第二:需要对?main=folder/dashboard.php路径中的斜杠进行URL编码。
  • 在所有情况下?main=dashboard.php,最终都会做require 'dashboard.php.php';
  • 我尝试了 url 编码,但它似乎不起作用(可能是我的错)。你能给我一个工作的例子吗? @MarkusZeller
  • 是的,因为您在 URL 中提供 .php 并添加代码。
  • 请注意:我同意您应该使用 URL 编码(作为您添加为 URL 的查询参数的任何内容的一般原则)。但是没有特别需要在查询字符串中对/ 进行 URL 编码,因为它们在 URL 的那部分没有特殊含义。

标签: php html href web-development-server


【解决方案1】:

不要求未经验证的用户输入文件!

<?php
// For Security a list of granted paths.
$allowedPaths = [
    'folder/dashboard.php',
];

$main = isset($_GET['main']) ? $_GET['main'] : '';
if(!in_array($main, $allowedPaths) {
   // Error handling
   die('Path not allowed');
}

require $main;
?>

链接可能看起来像

<a href="?main=folder%2Fdashboard.php">
  • 请注意,URL values 必须经过编码 -> echo urlencode('folder/dashboard.php'); 才能使斜杠有效。
  • 注意不要添加两次.php 扩展名(一次在 URL 中,一次在代码中)。

【讨论】:

  • 感谢您的回答!根据@Magnus Eriksson 的评论:“一般来说,不需要在查询字符串中对 / 进行 URL 编码,因为它们在 URL 的那部分没有特殊含义”我在没有编码的情况下尝试了它,它工作正常。所以,双 .php 似乎是问题所在。另一方面,关于验证的部分受到高度赞赏。我一定会实施的。
  • “请注意,必须对 URL 值进行编码……以使斜线有效。” - 不正确。斜杠在查询字符串中没有特殊含义。服务器只使用?之前的部分作为路径。
  • 这只是因为浏览器的天才错误处理。但通常 URL 值需要进行 URL 编码。 仅仅因为它有效,并不代表它是正确的。
猜你喜欢
  • 2021-07-03
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多