将$_GET['']与字符串混合


Mixing $_GET[''] with a string?

好的,我要做的是:

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

这不起作用。它被放置在一个工作站点内的a中,所以它只留下div空白。

如果我这样做:

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

我正在连接到mydomain.com/?page=index有人能给我一些建议吗?

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

<?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数组中的第一个。

试试这个:

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

如果你必须这样做,那么

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

但是正如其他人提到的,这确实暴露了一个安全漏洞。至少在page参数上做一些检查,以确保它不会将你链接到web服务器之外的文件。

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

现在,实际的问题是你的字符串在单引号中。如果你把它改成双引号,就可以了。但是你还是不应该这样做。

$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;
}
另一种方法是有一个可接受的文件名数组,并检查所请求的文件是否在该数组中。
$_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);