PHP中的冗余?更安全或更不必要

时间:2009-09-10 23:13:51

标签: php

我正在使用MVC模型(我认为这就是它所谓的)并且我将我的网站分成了较小的页面并且包括....检查相同的条件是否更安全/更好或更差(没有任何好处)两次?

例如,我的帐户页面如下所示:

// Must be logged in
if(isset($_SESSION['userID'])){

    include('edit_user.php');

}

然后在我的edit_user.php页面中,我有类似的内容:

// Must be logged in
if(isset($_SESSION['userID'])){

    if(isset($_POST['editUser'])){
        //Validate the form
    }
?>

<form>
// Display the form
</form>

<?php
} // End main IF

所以我正在检查用户ID是否设置了两次......我对我的所有页面都做了同样的事情(需要用户登录)。这真的有必要吗?我最初的想法是阻止未注册的用户直接访问edit_user.php表单并执行操作(我还想在用户直接访问页面时重定向)。你们有什么想法/建议?

修改

我不认为我太清楚地解释了自己......这只是一个例子......这是一个更好的例子来更好地理解我的问题的原因:

...帐户页面

if(isset$_SESSION['userID'])){

    include('edit_user.php');// edit user form

    include('change_password.php');// change password form

    include('change_pic.php');// change photo form

}

从我的每个内容中,我再次要求SESSION['userID'] ...所以,你们现在建议的是什么?

5 个答案:

答案 0 :(得分:2)

嗯,这是多余的,违反了“不要重复自己”(DRY)的设计原则。如果您的edit_user.php文件是公开可访问的,那么您肯定需要在那里进行检查,因此您可以删除其他检查,只要您确定其功能。

有争议的是,您的代码在检查时更加清晰,但是,从长远来看,这样的冗余会导致更多的维护麻烦。

答案 1 :(得分:1)

您不需要在那里进行多项检查。如果所有请求都通过控制器,那么您只需要在控制器中添加检查。这是控制器指向请求的重点。视图输出数据。该模型与数据库交互(并强制执行业务逻辑)。

答案 2 :(得分:0)

在许多情况下,冗余是有益的,但在您的示例中,这是不必要的。这也违背了DRY(不要重复自己)的原则。重复相同代码的次数越多,浪费的时间就越多(您也可能因重复而面临向代码添加错误的可能性)。你应该在edit_user.php中使用支票。

由于您正在使用MVC,因此我建议:定义一些全局可访问的身份验证功能。然后,在控制器的构造函数方法中,使用它们来查看是否应授予用户访问该节的权限。例如,如果他们未获得授权,您可以将其重定向到其他页面,或显示错误消息。当然,您可以使用更精细的方法,并在某些控制器方法的开头将调用放置到您的身份验证函数中。

答案 3 :(得分:0)

您应该始终验证来自控件外部的输入,以便用户可以访问的每个php脚本都应该检查。

即使您没有预料到,如果用户可以在网址中看到您网站中10个表格深度的网页中的链接,那么他们仍然可以直接跳转到该网站。

答案 4 :(得分:0)

Joomla使用了一个很好的方法,就是把它放在每个PHP文件的顶部:

defined('_JEXEC') or die('Restricted access');

_JEXEC在主入口点定义。你可以这样做:

if ( isset($_SESSION['userID']) ) {
    define('LOGGED_IN', 1);
    include('edit_user.php');
}

在edit_user.php和其他文件中使用:

defined('LOGGED_IN') or die('You must be logged in.');