2017-08-16 78 views
0

我有些PHP一个牛逼...所以什么即时试图做的是使用下面的代码PHP如果包括其他_GET显示错误

<?php include $_GET['topic']; ?> 

得到这样的URL来获取页面http://ulixtxteditor.org/entities/helpCentre?topic=credits 这对我来说很好,但是如果找不到页面,我想用else语句显示一个错误而不是空白页面。我该怎么办?例如:http://ulixtxteditor.org/entities/helpCentre?topic=所以这部分会显示一个错误?

<?php if(isset){include $_GET['topic'];} else {echo "error"} ?> 

我试过这个,但它不会工作。

+0

你给出的例子是如何工作的?它没有文件类型 – GrumpyCrouton

+3

“我想使用else语句”。那么,什么阻止了你?这里没有尝试if/else逻辑。 –

+1

这也不适用于路径非常好等,这是不是一个好办法做到这一点。你想做一个MVC布局?这是错误的方式 – GrumpyCrouton

回答

2

使用这样的事情:

<?php 
// In case topic parameter wasn't provided you will have fallback. 
$topic = isset($_GET['topic']) ? $_GET['topic'] : ''; 
// Now you can check topic and have valid file name. 
switch ($topic) { 
    case 'credits': 
     $fileName = 'credits.php'; 
     break; 
    default: 
     $fileName = 'index.php'; 
     break; 
} 
// Now it is possible safely include file. 
include __DIR__ . DIRECTORY_SEPARATOR . $fileName; 

直接includerequire建设使用$_GET['topic']是不安全的,因为你容易受到“目录遍历攻击”。此外,你总是必须验证输入参数,目的是避免包括在PHP脚本的CSS文件等...

0

这是一个相当普遍的方式来实现一个简单的接线盒/路由器。使用switch语句。

$topic = isset($_GET['topic']) ? $_GET['topic'] : ''; 
switch ($page) { 
    case 'credit': 
    case 'otherpage': 
    case 'otherpage2': 
     require_once(dirname(__FILE__) . '/' . $page . '.php'); 
     break; 
    default 
     require_once(dirname(__FILE__) . '/' . 'default.php');  
} 

您在顶部为每个加入一个case语句白名单页面/主题,以及任何不匹配或有一个页面被载入默认页面处理。

在这个例子中,我假设所有的主题页面都与这个脚本(通常名为index.php)在同一个目录中。

2
<?php include $_GET['topic']; ?> 

不这样做。它创建了一个巨大而且容易被利用的安全漏洞。

例如:

  • ?topic=index.php - 创建无限循环

  • ?topic=/etc/passwd - 显示从服务器

  • ?topic=/proc/self/environ敏感数据 - 从处理环境中执行的代码。这将经常包含用户控制的数据,如HTTP头的值,允许远程执行代码。

您的网站如果实施该被利用。有许多机器人扫描公共网站的这个漏洞,其中许多机器人会在检测到时自动利用它。

如果要基于GET变量的值包含文件,请使用switch($_GET['topic')来定义该变量的可接受值。这也可以让你实现错误处理作为default:子句。