此有效性检查是否易受攻击

时间:2009-11-17 12:01:02

标签: php code-injection security

我在通过GET请求包含其他文件的页面中包含此代码:

$page = strtolower($_GET['page']);

if(!$page or !$allow[$page] or $page == 'home') {
    header("Location: home.php");
}

其中$allow是一个硬编码数组,其中包含允许的字符串列表,这些字符串是要包含的有效文件。我是否遗漏了一些明显允许注入代码的东西,或者这个检查是否足够好?

5 个答案:

答案 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的内容不符合,则不要进一步处理..