我在通过GET请求包含其他文件的页面中包含此代码:
$page = strtolower($_GET['page']);
if(!$page or !$allow[$page] or $page == 'home') {
header("Location: home.php");
}
其中$allow
是一个硬编码数组,其中包含允许的字符串列表,这些字符串是要包含的有效文件。我是否遗漏了一些明显允许注入代码的东西,或者这个检查是否足够好?
答案 0 :(得分:3)
只要register_globals不允许$ allow被覆盖,它就不容易受到攻击。
它会抛出通知,而且我个人不会不区分大小写,所以我会这样做:
if (empty($_GET['page']) || empty($allow[$_GET['page']]) || ($_GET['page'] == 'home'))
{
// Technically a header location should be a complete URL - http://...
header("Location: home.php");
exit();
}
答案 1 :(得分:2)
似乎没问题。只需在header()之后添加一个exit()语句,以确保即使header()失败,脚本也会终止。
答案 2 :(得分:0)
这就够了
$allow = array('home', 'another_one', 'blah');
$page = isset($_GET['page']) ? $_GET['page'] : 'home';
if(in_array($page, $allow, true))
include "$page.php";
我不确定你为什么在那里使用“标题”
答案 3 :(得分:0)
“足够好”是一个非常广泛的画笔。你能扩展一点吗?另外,如果您知道$ _GET ['page']应该限制为一小组值(例如,整数或仅包含小写字母的标识符等等),那么使用正则表达式验证数据绝对不会受到伤害。
答案 4 :(得分:0)
首先在$ page上执行正则表达式可能会更好,以确保它在进一步检查之前符合可以传入的已清理标准,如果$ page的内容不符合,则不要进一步处理..