2009-11-17 50 views
0

我有这样的代码在包括经由GET请求的其他文件的页面:这个有效性检查是否易受攻击?

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

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

$allow哪里是包含允许字符串将被包括有效的文件的列表的硬编码阵列。我是否错过了一些可以允许代码注入的明显的东西,或者这个检查足够好?

回答

3

只要register_globals不允许$允许被覆盖,它不是脆弱的。

它会抛出声明,虽然,我个人不会有不区分大小写的,所以我不喜欢这样写道:

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(); 
} 
+0

register_globals已关闭,所以这不是问题,不区分大小写仅适用于后面的include。我知道我可以添加更多的限制条件(只是一个ctype_alnum()也许),但这只会是多余的,我猜?我正在与一位主持人争论,因为我的脚本一直在说一些奇怪的东西被执行,但我真的不能再现任何可以注入恶意代码的情况。 – 2009-11-17 12:13:17

+0

我不认为这是让事情被注入的那条线 – Greg 2009-11-17 12:27:35

2

似乎没问题。只需在header()后添加一个exit()语句来确保即使header()失败,脚本也会终止。

0

这将是足够的

$allow = array('home', 'another_one', 'blah'); 
$page = isset($_GET['page']) ? $_GET['page'] : 'home'; 
if(in_array($page, $allow, true)) 
    include "$page.php"; 

我'不知道为什么你使用“标题”那里

0

“够好”是一个非常宽的画笔。你可以扩大一点吗?另外,如果你知道$ _GET ['page']应该被限制为一小部分值(比如整数,或者只包含小写字母的标识符等等),那么使用正则表达式验证数据是绝不会受伤的。

0

最好在$页面上执行一个正则表达式,以确保它符合在进一步检查之前可以传递的消毒标准,如果$页面的内容不符合,则不会进一步处理。 ..

相关问题