【问题标题】:Mixing $_GET[''] with a string? [closed]将 $_GET[''] 与字符串混合? [关闭]
【发布时间】:2013-03-04 03:23:05
【问题描述】:

好的,所以我正在尝试执行以下操作:

<?php include('pages/{$_GET["page"]}.txt'); ?>

Wich 不起作用。它被放置在 a 内的工作站点中,因此它只是将 div 留空。

如果我这样做:

<?php include('pages/index.txt'); ?>

它有效。

我正在连接到 mydomain.com/?page=index 有人可以在这里给我一些提示吗?

我尝试搜索,但没有成功。

【问题讨论】:

  • 你需要先跳出你的字符串。您的引号之间的任何内容都是按字面意思理解的。
  • 哦,请不要那样做。这是最常见的漏洞之一。问题是,用户可以输入任何内容作为页面参数,从而包含来自服务器的每个可访问文件。
  • 1#我才意识到原来是这个错,我很困惑2#既然你这么说,你就对了。有没有办法限制/解决这个问题?我不想使用 if,因为它需要更多的手动操作。我想让它尽可能简单。
  • 问题和答案都被否决了,请大家留言说明原因。
  • 投反对票可能是因为以这种方式包含文件存在潜在的安全漏洞

标签: php variables html


【解决方案1】:

编辑:正如许多人所说,以这种方式做你想做的事是不安全的。 这里有一个让它变得更好的简单方法:

<?php 
    $valid_pages = array('index', 'contact', 'faq');
    $page = $_GET["page"];

    if (!in_array($page, $valid_pages)) {
        $page = $valid_pages[0];
    }

    include("pages/{$page}.txt"); 
?>

这将检查用户想要的页面是否在允许的页面内,如果不是,它将使用$valid_pages数组中的第一个。

【讨论】:

  • 这破坏了我正在尝试做的事情。有没有办法从文件夹中加载有效页面?
  • 是的,将 $valid_pages 替换为包含文件夹中文件名的数组。应该不会太难。
  • 啊,我明白了。非常感谢!
  • @GuploaderUpload 这样的东西应该可以正常工作:$valid_pages = array_diff(scandir("pages/"), array('..', '.'));
  • 啊,非常感谢!我几乎写完了类似的东西,但谢谢!
【解决方案2】:

试试这个:

<?php include('pages/' . $_GET["page"] . '.txt'); ?>

【讨论】:

  • 这行得通,我才意识到我犯了一个多么愚蠢的错误,谢谢!
【解决方案3】:

如果你必须这样做,那么

<?php include('pages/' . {$_GET["page"]} . '.txt'); ?>

但正如其他人所提到的,这确实暴露了一个安全漏洞。至少检查一下页面参数,以确保它不会将您链接到 Web 服务器之外的文件。

【讨论】:

    【解决方案4】:

    首先,不要这样做!太没有安全感了!如果您这样做,我可以访问您网站上的任何文件。太糟糕了。

    现在,您所拥有的实际问题是您的字符串是单引号。如果将其更改为双引号,它将起作用。但你仍然不应该这样做。

    $foo = "QQQ";
    
    echo "asfd{$foo}asdf";
    > asfdQQQasdf
    echo 'asfd{$foo}asdf';
    > asdf{$foo}asdf
    

    修复漏洞的一种方法是设置白名单。这是一个简单的例子:

    $file = "foo";
    
    switch ($file) {
        case "foo":
            include ("pages/foo.txt");
            break;
        case "bar":
            include ("pages/bar.php");
            break;
        default:
            echo "YOU CANNOT ACCESS THIS FILE!";
            break;
    }
    

    另一种方法是有一个可接受的文件名数组,并检查请求的文件是否在该数组中。

    【讨论】:

    【解决方案5】:
    $_GET['page'] = "index";
    $allowed_page = array("index", "about", "contact");
    $page = htmlentities($_GET['page']);
    if((isset($_GET['page']) && $_GET['page'] != "")  && in_array($page, $allowed_page)){
    $page = $_GET['page'];
    }
    $final_page =  'pages/' . $_GET["page"].'.txt';
    include($final_page);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-06
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多