PHP寻找一种简洁的方法来防止未经授权的用户查看页面

时间:2010-02-16 07:08:56

标签: php authentication

我正在寻找一种方法来防止未经授权的用户查看网页,而不是假设将所有内容都包装在if authed { show page } else { show error}

我的网站目前设置如下:

的index.php

require_once __WEBROOT__ . '/templates/default/header.tmpl';
require_once content('p');
require_once __WEBROOT__ . '/templates/default/footer.tmpl';

内容()

function content($GETvar)
{
   $content  = '';
   $root     = __WEBROOT__;
   $location = 'content';
   $files    = scanDirRecursive($root . '/content/');

   if (isset ($_GET[$GETvar]))
   {
      $path = str_replace('\\', '/', $_GET[$GETvar]->toHTML());

      if (in_array("$root/$location/$path", $files))
      {
         $content = "$root/$location/$path";
      }
      else
      {
         $content = $root . '/templates/default/errors/404.php';
      }
   }
   else
   {
      $content = __WEBROOT__ . '/content/home.php';
   }

   return $content;
}

这很好用。当我玩auth选项时,我在“内容”页面顶部的“返回”中查看。最终导致内容页面无法加载,但保持模板的正常运行(与die()不同)。

所以我想知道,这样安全吗?或者是否发生了我没有看到的错误......

5 个答案:

答案 0 :(得分:2)

使用前控制器模式。而不是将所有页面都作为单独的PHP文件,只有一个“入口点”。

基本上,让你的index.php文件像index.php一样工作吗?p = foo其中foo定义要显示的页面。这样,您的所有请求都将通过index.php,您可以在一个地方包含所有访问权限。请记住小心不要允许包含任意文件 - 这种方法常见的初学者错误。

然而,正如所指出的,您可能希望研究像Cake或Zend这样的框架如何执行这项工作。

答案 1 :(得分:1)

需要一个登录页面,用于设置会话变量,例如userid。然后在每个页面上调用一个函数来检查授权。如果同时考虑页面和用户,它可能会放在标题中。

如果没有用户登录,或者不允许他们访问该页面,请重定向到登录页面 - 最好添加一条消息,说明他们无法登录而无法使用他们请求的页面。

注销应该清除会话变量。此外,如果存在会话超时,请在重置超时的时间内在会话变量中记录时间戳。

答案 2 :(得分:1)

为什么重新发明轮子?每个php框架都有它的acl模块,你可以用最少量的编码来设置安全策略。看看cakephp或google acl框架......

答案 3 :(得分:0)

如果登录,请不要执行此操作{} else {complain,}只是将它们重定向到登录页面,如果它们未被识别,那么die();

答案 4 :(得分:0)

我发现简单地为这些东西抛出一个Exception很方便。有几种策略,但有一种可能涉及以下情况:

function show_content()
{
  if( ! $user_is_allowed_to_see_this_content ) {
    throw new Exception('This user may not see this content', 403);
  }

  // Continue on with the content code
}

默认情况下,这只会出错,但您可以使用set_exception_handler()函数来定义抛出异常时会发生的具体情况。这使您可以在与内容处理代码分开的位置定义“当出现错误时应该做什么”逻辑,我发现这使得事情变得更加整洁。

例如:

function custom_exception_handler( Exception $exception ) 
{
  // Log the Exception
  error_log( $exception->getMessage(), 0 );

  // Return the generic "we screwed up" http status code
  header( "HTTP/1.0 500 Internal Server Error" );

  // return some error content
  die("We're sorry.  Something broke.  Please try again.");
}

// Now tell php to use this function to handle un-caught exceptions
set_exception_handler('custom_exception_handler');

值得注意的是,这是一种处理所有逻辑故障事件的通用方法,而不仅仅是身份验证失败。文件未找到异常,验证异常,数据库查询异常,需求限制异常;这些都可以用同样的方式处理。