【问题标题】:Secuity considerations when including files包含文件时的安全注意事项
【发布时间】:2010-08-14 13:23:40
【问题描述】:

我正准备在php中基于$_GET数组设置一个请求路由系统。

例如,对于 url ?r=login,我会使用 include myfiles/".$_GET['r'].".php"; 这会自动指向 myfiles/login.php

我知道我需要清理 get 输入,但我担心可能会恶意重定向包含。谁能建议如何防止这种情况?我也可以在调用之前检查文件是否确实存在?

我有一些自己的想法,我只是想知道我没有错过任何考虑。

【问题讨论】:

  • 如果我在 get 变量之前使用绝对路径设置包含,这会阻止重定向到站点外吗? (我正在考虑将包含内容放在网络根目录之上,不公开)。

标签: php security include get


【解决方案1】:

最好不要包含通过 url 指定的文件。如果您仍想这样做,请使用switch 语句或任何array 来过滤内容并仅包含您需要的内容:

示例 1:

$page = $_GET[...];

switch($page){
  case 'login': include 'login_page.php'; break;
  // and so on
  default: die("bye bad guy !");
}

示例 2:

$page = $_GET[...];

$pages = array('page1.php', 'page2.php', 'page3.php');

if( in_array($page, $pages) )
{
    include($page);
{
else
{
   die("bye bad guy !");
} 

我建议你看看这些相关的安全教程:

【讨论】:

  • 有没有更好的方法在 PHP 中设置路由系统?
  • @YsoL8:看看我的回答中的示例 2。对于您所处的这种情况,这是我能想到的。
  • 我希望自动设置路径以帮助保持结构一致。你会反对吗?
  • @YsoL8:不,我不是;整个想法是你应该这样做,如果用户从浏览器修改你的 url,他们不应该包含任何恶意脚本。
【解决方案2】:

如果可以,请使用白名单。如果你不能,那么:

  • 只允许下划线和字母数字字符
  • 将包含文件放到单独的目录中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多