2011-11-01 221 views
0

我有一个简单的登录页面,用于检查数据库凭据,然后每个页面都包含auth.php,验证$_SESSION['logged']已设置,并且该会话未过期。php身份验证最佳实践...?

问题是,每个页面还包含另一个页面tab.php(类似于菜单),我也需要限制访问,但包括auth.php在内的tab.php使得包含发生两次。如果我不包含auth.phptab.php,任何人都可以直接跳过tab.php绕过验证检查,并可能检索隐私信息。

要解决这种情况的最佳实践?

编辑:

我忘了问,但你用什么路径,使其相对于站点根目录?由于两个auth.phptab.php是在文件夹和index.php包括tab.php是根 - include函数根据我用什么路径('./includes/auth.php' OR './auth.php')给出了一个错误或者index.phptab.php - 如果你知道我的意思。我试过'/includes/auth.php',但那不起作用。

+0

你是什么意思“任何人都可以访问标签。 PHP的“?你是说如果他们知道文件的路径,他们可以通过手动输入来查看它? – Gazillion

+0

所以你想确定,必须包含auth.php,但你不想包含两次? – dwalldorf

+0

难道你不需要:'include_once()'? – PeeHaa

回答

0

include_oncerequire_once一定会确保您没有多次包含相同的文件(同时请确保您已通过身份验证)。

然而,我会做的是将你的包括添加到“包含”文件夹,并禁止访问 - 手动输入路径的人 - 通过htaccess文件。这样你就可以将你的包含在一个地方(无论你的头文件包含什么样的内容),并且保持你的包含文件清洁且仍然无法使用。如果你这样做,你只需要做一些上面提到的答案,并检查你的$_SESSION['logged']是否已设置(以及任何其他你需要的检查)

+0

这对我来说似乎是一个完美的想法(因为我已经将我的包含文件放在一个单独的文件夹中),但这个概念对我来说是新的。当您完全限制对该文件夹的访问时,是否还需要包含'$ _SESSION ['logged']'检查包含文件('tab.php'和其他文件)? – Dwelle

+0

那么我真的不知道你的网站是如何工作的。在这种情况下,我想你不会真的需要它,但我通常有不同的菜单,具体取决于用户类型(管理员,版主,香草用户)。因此,在这种情况下,不是检查它们是否真正通过身份验证,而是检查哪种用户并显示正确的选项卡。 – Gazillion

+0

我的观点是限制对'tab.php'文件的访问,这个文件本身不会在浏览器中单独加载(它甚至不包含样式,只包含文本) - 以防某些人手动输入文件路径。我刚刚意识到,通过检查'$ _SESSION',你还必须在'tab.php'内初始化'session_start();',如果你以后在index.php中包含这个页面,会话初始化,如果我得到它的权利。 – Dwelle

1

在您的文件(或require_oncerequire)中使用include_once而不是include。这将确保您的auth.php文件只在脚本的生命周期中包含一次。

+0

是的,你是对的。我想确定我实际上在做什么被认为是最佳实践,或者如果你关注我,还有其他方法可以限制访问包含在其他文件中的文件。 – Dwelle

+0

不过,您正在调用认证方法两次,当您在认证成功时向会话写入时,这不是必需的。在tab.php中检查正确的会话值并在出现错误(如果不可用)时就足够了。 –

+0

是的,我知道。但是,这在单独的文件中打破了这项检查的全部重点。例如,如果我要更改会话时间限制,我必须在'auth.php'和'tab.php'(以及其他包含的文件 - auth.php'由以下内容组成: '$ _SESSION' check and'$ _ SESSION' time limit – Dwelle

0

只要在tab.php中检查会话是否已初始化并且$ _SESSION ['logged']为true。如果首先加载auth.php,这将工作正常。

+0

否则会返回一个错误或警告并填写你的日志和不必要的消息 – dwalldorf

+0

它不会。只是代码聪明:'if(!isset($ _ SESSION ['logged']] )||!$ _ SESSION ['logged']){die('Access not granted');}' –

+0

无论如何,这是一个不稳定的解决方案,因为他必须将此代码添加到以后可能使用的任何文件中。如果他改变会话命名空间,他必须适应他使用你的解决方案的每个文件。require_once更好,我猜 – dwalldorf

0

如何使用require_once("auth.php");?这可以确保包含auth.php(否则应用程序将停止),但只包含文件一次这似乎是您的目标。

相关问题