簡體   English   中英

PHP尋找一種簡潔的方法來防止未經授權的用戶查看頁面

[英]PHP looking for a neat way to prevent unauthorised users from viewing pages

我正在尋找一種方法來阻止未經授權的用戶查看頁面,而不是讓我們說if authed { show page } else { show error}將所有內容包裝在一個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())。

所以我想知道,這樣安全嗎? 或者是否發生了我沒有看到的錯誤......

使用前控制器模式。 而不是將所有頁面都作為單獨的PHP文件,只有一個“入口點”。

基本上,讓index.php文件像index.php一樣工作嗎?p = foo其中foo定義了要顯示的頁面。 這樣,您的所有請求都將通過index.php,您可以在一個地方包含所有訪問權限。 請記住要小心不要包含任意文件 - 這種方法常見的初學者錯誤。

但是,正如所指出的,您可能希望研究像Cake或Zend這樣的框架如何執行此工作。

需要一個登錄頁面,用於設置會話變量,例如userid。 然后在每個頁面上調用一個函數來檢查授權。 如果它同時考慮頁面和用戶,它可能會放在標題中。

如果沒有用戶登錄,或者不允許他們訪問該頁面,則重定向到登錄頁面 - 最好添加一條消息,說明他們無法登錄而無法使用他們請求的頁面。

注銷應該清除會話變量。 此外,如果存在會話超時,請在重置超時的時間在會話變量中記錄時間戳。

為什么重新發明輪子? 每個php框架都有它的acl模塊,你可以用最少量的編碼來設置安全策略。 看看cakephp或google acl框架......

如果登錄,請不要執行此操作{} else {complain,}只是將它們重定向到登錄頁面,如果它們未被識別,則die();

我發現簡單地為這些東西拋出一個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');

值得注意的是,這是一種處理所有邏輯故障事件的通用方法,而不僅僅是身份驗證失敗。 文件未找到異常,驗證異常,數據庫查詢異常,需求限制異常; 這些都可以以相同的方式在同一個地方處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM