PHP ищет удобный способ предотвратить просмотр страниц посторонними пользователями - PullRequest
1 голос
/ 16 февраля 2010

Я ищу способ предотвратить просмотр страниц неавторизованными пользователями, скажем, без упаковки в 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;
}

Это хорошо работает. Когда я играл с опциями авторизации, я добавил «возврат» вверху страницы «контент». Который в итоге не позволил загрузке страницы содержимого, но сохранил шаблон в такте (в отличие от die ()).

Так что мне было интересно, это безопасно? Или произошла ошибка, которую я не вижу ...

Ответы [ 5 ]

2 голосов
/ 16 февраля 2010

Используйте шаблон переднего контроллера. Вместо того, чтобы все ваши страницы были отдельными файлами PHP, используйте одну «точку входа».

По сути, ваш файл index.php работает как index.php? P = foo, где foo определяет, какую страницу показывать. Таким образом, все ваши запросы будут проходить через index.php, и вы сможете включить всю проверку доступа в одном месте. Помните, что будьте осторожны, чтобы не допустить включения произвольных файлов, хотя - распространенная ошибка новичка при таком подходе.

Однако, как указывалось, вы можете изучить, как фреймворки, такие как Cake или Zend, выполняют эту работу.

1 голос
/ 16 февраля 2010

Зачем изобретать велосипед? У каждого php-фреймворка есть свой модуль acl, где вы можете установить политику безопасности с минимальным количеством кода Взгляните на cakephp или в google acl framework ...

1 голос
/ 16 февраля 2010

Требуется страница входа, которая устанавливает переменную сеанса, скажем, с идентификатором пользователя. Затем на каждой странице вызывайте функцию для проверки авторизации. Вероятно, его можно поместить в заголовок, если он учитывает как страницу, так и пользователя.

Если ни один пользователь не вошел в систему или ему не разрешено заходить на страницу, перенаправьте на страницу входа в систему - было бы неплохо добавить сообщение о том, что он не может использовать запрошенную страницу без входа в систему. *

Выход из системы должен очистить переменные сеанса. Кроме того, если требуется время ожидания сеанса, запишите временную метку в переменную сеанса, которая сбрасывает время ожидания.

0 голосов
/ 19 февраля 2010

Мне показалось удобным просто исключение для таких вещей. Существует несколько стратегий, но одна может включать такой сценарий, как:

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');

Стоит отметить, что это хороший универсальный способ обработки всех событий логических сбоев, а не только сбоев аутентификации. Исключения не найденных файлов, исключения проверки, исключения запроса к базе данных, исключения регулирования спроса; все они могут обрабатываться одинаково и в одном и том же месте.

0 голосов
/ 16 февраля 2010

не делать, если вошли в систему, сделайте это {} else {жаловаться,} просто перенаправьте их на страницу входа, если они не идентифицированы, затем die ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...