我在PHP上有点新手...所以我想做的是使用以下代码获取页面
<?php include $_GET['topic']; ?>
获取此类网址http://ulixtxteditor.org/entities/helpCentre?topic=credits 这对我很有用,但是如果没有找到页面我想使用else语句来显示错误而不是空白页面。我该怎么办?例如:http://ulixtxteditor.org/entities/helpCentre?topic=所以这部分会显示错误吗?
<?php if(isset){include $_GET['topic'];} else {echo "error"} ?>
我尝试了这个,但它不会工作。
答案 0 :(得分: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;
直接在$_GET['topic']
或include
构建中使用require
是不安全的,因为您容易受到“目录遍历攻击”的攻击。此外,您始终必须验证输入参数的目的,避免包含在php脚本css文件等...
答案 1 :(得分:2)
<?php include $_GET['topic']; ?>
不要这样做。它会造成一个庞大且容易被利用的安全漏洞。
例如:
?topic=index.php
- 创建无限循环
?topic=/etc/passwd
- 显示来自服务器的敏感数据
?topic=/proc/self/environ
- 执行流程环境中的代码。这通常包括用户控制的数据,如HTTP标头的值,允许远程执行代码。
如果您实施此网站,将被利用。有许多机器人扫描公共网站是否存在此漏洞,其中许多将尝试在检测时自动利用它。
如果要根据GET变量的值包含文件,请使用switch($_GET['topic')
定义该变量的可接受值。这也允许您将错误处理实现为default:
子句。
答案 2 :(得分: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');
}
您通过在每个顶部添加一个案例陈述将您的页面/主题列入白名单,并且通过加载默认页面来处理任何不匹配或有页面的内容。
在此示例中,我假设所有主题页都与此脚本位于同一目录中(通常名为index.php)。