2011-03-06 16 views
0

我正在开发一个小型的,特定于应用程序的CMS。没有什么财务可言,而且内容实际上并不敏感(这主要是管理艺术品之间的关系),所以安全性并不是最重要的,但我们仍然在使用具有受控用户组的登录系统每次安装。针对整个网站进行测试并对登录状态作出反应的最佳做法

入口页面有一个登录表单 - 成功会将会话变量设置为该用户的用户表的PK,并重定向到任意视图页面。该变量还用于跟踪该用户所做的任何更改。

我将auto_prepending所有页面一个小脚本,只是检查是否设置了会话变量 - 如果不是,用户会弹回到登录页面。这工作,但似乎笨拙 - 尤其是因为我需要“豁免”的登录页面,所以我用了一个丑陋的小黑客,这基本上是这样的:

if(!isset($_SESSION['user']) && strpos($_SERVER['PHP_SELF'], '/login.php') !== 0) { 
    header('Location: /login.php'); 
} 

以上被简化,从实际的脚本一点,但基本上可以证明发生了什么。

我不知道是否有一个既定的最佳实践这样的事情 - 测试的登录状态,并在未设置状态重定向...

tyia

回答

1

好像你正在使用标准方法。但是不必将这个脚本包含在你的每个PHP页面中,我会让所有请求都通过一个负责安全性的index.php文件。这样,您就可以确定存在单点故障:您的index.php文件。

为了得到这个打算,因此当你正在运行的Apache需要一个.htaccess文件:

 
<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_URI} .*\.php$ 
    RewriteRule ^(.*)$ /index.php?script=$1 
</IfModule> 

或者,你可以在每一个页面的顶部定义一个函数,包括它需要一个登录:

 
// in security.php 
function require_login($redirect_to='/login.php) { 
    if (empty($_SESSION['user'])) { 
     header('Location: ' . $redirect_to); 
     exit(); 
    } 
} 

// and in your .php files except for login.php 
include_once 'security.php'; 
require_login(); 

也可能需要测试,不仅“用户”在会话被设置,但是,它包括一些标识符(即一个ID)。

+0

这就是我现在正在做的事情(我给出的例子被削减了,auto_prepend被用于其他的东西,所以我只是捎带) - 并且你已经确认这是'标准“,这实质上是一个问题 - 感谢您的快速回复。 – momo 2011-03-07 01:25:14