如何仅包含特定页面

时间:2013-06-24 00:59:29

标签: php

昨天我问了一个关于如何包含通过URL传入的文件的问题,有人给我这个:

if (isset($_GET['file'])){
  include($_GET['file'].'.php');
}

但其中一个答案告诉我要对此做些什么来避免黑客可能发生的攻击或类似的攻击。问题是我自己不明白该怎么做。

他说我应该这样做:

$pages_array=('home','services','contact').

然后检查GET var:

if(!in_array($_GET['page'], $pages_array) { die(); }

这是做什么的,以及如何将其整合到上面的原始代码中?

6 个答案:

答案 0 :(得分:1)

代码通过确保GET中存在页面名称来检查从浏览器传递到PHP页面的$pages_array信息。

只要列出$pages_array中的所有页面,代码就会执行。如果页面不在您的数组列表中,那么它将die并且不会被执行。

使用GET时,验证以这种方式发送的代码总是有益的,因为可以发送和执行任意语句而无需验证。

在这种情况下,代码正在被验证 - 所以你已经采取了必要的步骤;只要你没有提交的代码就没有了。

更正代码

$pages_array=array('home','services','contact');

答案 1 :(得分:1)

您的原始代码正在寻找网址中的file参数,然后包含传入的任何文件。因此,如果有人访问您的PHP页面并将?file=something.txt添加到网址,那么您可以ll在输出中包含something.txt的内容。

这个问题是任何人都可以手动修改URL以尝试包含他们想要的任何文件 - 让他们看到系统中应该是私有的文件。

解决方案是拥有一个允许的文件名列表,如下所示:

$pages = array('home', 'services', 'contact');

然后在包含文件之前,先检查它是否是允许的文件名之一。

$pages = array('home', 'services', 'contact');
if (isset($_GET['file'])){
    if (!in_array($_GET['file'], $pages_array)) {
        exit('Not permitted to view this page');
    }
    include($_GET['file'].'.php');
}

我们使用PHP array 来定义允许的网页列表,检查我们的网页是否在列表中 in_array() 功能,然后停止所有脚本执行,如果它不在具有 exit() 功能的列表中。

答案 2 :(得分:0)

你几乎回答了自己的问题......

除此行外...

$pages_array=array('home','services','contact');

而不是你拥有的......

$pages_array=('home','services','contact').

答案 3 :(得分:0)

//change the variable array declaration
$newArray = array('home','services','contact');

只需在你的if

中做一个else语句
 else { 
     //include your file
     include($_GET['page'].'.php');
  }

答案 4 :(得分:0)

基本上,您的数组定义语法是错误的,但如果die()未设置,$_GET['file']的原因也是错误的?如果你恢复默认值以便无声地失败,那会不会更好。

使用in_array()

<?php
$pages_array = array('home','services','contact');

if(isset($_GET['file']) && in_array($_GET['file'], $pages_array)){
    include($_GET['file'].'.php');
}else{
    include('home.php');
}
?>

甚至使用带有硬编码值的switch()

<?php
$page = isset($_GET['file']) ? $_GET['file'] : 'home';
switch($page){
    case "home"     : include($page.'.php'); break;
    case "services" : include($page.'.php'); break;
    case "contact"  : include($page.'.php'); break;

    default:
        include('home.php');
        break;
}
?>

答案 5 :(得分:-1)

$pages=array('home','services','contact');

if(isset($_GET['page']))

{


$page=$_GET['page'];

if(!in_array($page,$pages)) 

{

die ('');


}

else {

include($page.'.php');

}
 }

因此,您的链接将如下所示:

yoursite.com/index.php?page=home - &gt;使用此工具:

http://www.generateit.net/mod-rewrite/

你可以制作更好的网址。