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

时间:2013-03-03 19:06:49

标签: php variables html

好吧,我正在努力做到以下几点:

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

哪个不起作用。它被放置在一个工作站点内,所以它只是将div留空。

如果我这样做:

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

它有效。

我正在连接到mydomain.com/?page=index 谁能在这里给我一些提示?

我试过搜索,但没有运气。

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

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

现在,你所拥有的实际问题是你的字符串是单引号。如果你把它改为双引号,那就行了。但是你仍然不应该这样做。

$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;
}

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

答案 3 :(得分:0)

如果你必须这样做,那么

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

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

答案 4 :(得分:0)

$_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);