通过$ _GET注册位置标头的php安全性

时间:2009-05-22 12:14:07

标签: php security

我的页面上有这个代码:

header("Location: $page");

$ page作为GET变量传递给脚本,我需要任何安全性吗? (如果是的话)

我打算只使用addslashes(),但这会填充URL ......

4 个答案:

答案 0 :(得分:8)

可以将您的用户转发到,就像我让他们点击链接一样,这绝对是一个很大的安全漏洞(请登录www.yoursite.com?page=badsite.com)。现在想想badsite.com看起来与您的网站完全一样的情况,除了它抓住了用户的凭据。

最好在代码中定义$urls数组,并仅将索引传递给该数组中的条目,例如:

$urls = array(
    'pageName1' => '/link/to/page/number/1',
    'pageNumber2' => '/link/to/page/number/2',
    'fancyPageName3' => '/link/to/page/number/3',
);
# Now your URL can look like this:
# www.yoursite.com?page=pageName1

答案 1 :(得分:3)

这本书是code injection vulnerability。用户可以输入他想要的任何值,并且您的脚本将遵守而不会有任何投诉。

但最重要的规则之一 - 即使不是 最重要的规则 - 是:

  

永远不要相信用户数据!

因此,您应该检查已传递的值并进行验证。即使是header injection vulnerability was fixed with PHP 4.4.2 and 5.1.2 respectivly,您仍然可以输入任何有效的URI,并且调用它的用户将被重定向到它。甚至像?page=%68%74%74%70%3a%2f%2f%65%76%69%6c%2e%65%78%61%6d%70%6c%65%2e%63%6f%6d%2f这样的含义?page=http://evil.example.com/的{​​{1}}。

答案 2 :(得分:2)

是的,你这样做。仅仅因为你或我不能立即想到一种方法来利用那一点点代码并不意味着一个更聪明的人不能。您要做的是确保重定向转到您认为可访问的页面。即使这种简单的验证也可以起作用:

$safe_pages = array('index.php', 'login.php', 'signup.php');
if (in_array($page, $safe_pages)) {
  header("Location: $page");
}
else {
  echo 'That page is not accessible.';
}

答案 3 :(得分:0)

或者,至少,定义允许的URL的白名单,并且只有当用户提供的URL位于GET变量中时才转发用户。