2

我的 PHP+JS+Ajax 应用程序需要用户登录,然后将登录数据保存到 $_SESSION。

用户分为三种类型:用户、版主、管理员。每个人都比以前拥有更多的权利。

所有查询均针对 ajax_req.php

因为我想保证 ajax_req.php 的安全,所以我检查 $_SESSION 数据以确定用户是否已登录以及他/她属于哪个组。

代码如下:

if(isset($_SESSION['logged'])) {
    if(isset($_SESSION['group_id'])) {
        $group_id=(int)$_SESSION['group_id'];

        if($group_id==ADMIN_GROUP) {
            $login_success=1;
        } else if ($group_id==MODERATOR_GROUP) {
            $login_success=1;
        } else if ($group_id==USER_GROUP) {
            $login_success=1;
        } else {
            $login_success=-1;
        }
    } else {
        $login_success=-1;
    }
} 

if($login_success<1) {
    header('HTTP/1.1 401 Unauthorized');
    $ret = array('status' => 'FALSE', 'txt' => 'Unauthorized access. Please check if You are still logged in.' );
    print json_encode($ret); 
    exit();
}

第一个问题:我这样做对吗?

第二个问题

我想保护我的应用程序不发出针对管理员的命令。

接下来,我有以下功能:

function assert_right($group_id, $needed) {
    if($group_id==ADMIN_GROUP) {
        return true; 
    } else if ($group_id==MODERATOR_GROUP) {
        if($needed==USER_GROUP || $needed==MODERATOR_GROUP) {
            return true; 
        }
    } else if ($group_id==USER_GROUP) {
        if($needed==USER_GROUP) {
            return true; 
        }
    } 

    header('HTTP/1.1 403 Forbidden');
    $ret = array('status' => 'FALSE', 'txt' => 'Unauthorized access. You do not have sufficient rights to do this action.' );
    print json_encode($ret); 
    exit();
}

在敏感行动之前,我打电话给

assert_right($_SESSION['group_id'], ADMIN_GROUP);

第二个问题:第一种情况返回401,第二种情况返回403是否正确?基本上,403 表示“禁止”,根据http://en.wikipedia.org/wiki/List_of_HTTP_status_codes表示“请求是合法请求,但服务器拒绝响应它。与 401 Unauthorized 响应不同,身份验证不会有什么不同。”。我还检查了https://dev.twitter.com/docs/error-codes-responses,这是对另一个问题的回答。

对我来说,403 似乎是正确的,因为如果用户已经登录,那么他/她可能没有管理员帐户。更重要的是,除非我犯了编程错误或用户破解了通过 Ajax 发送的数据,否则用户永远不会看到这一点。

还有一件事需要注意:没有向用户显示 401 或 403 状态代码:Ajax 和 JavaScript 使用它们来显示适当的错误消息。如果收到 401,JavaScript 会显示文本:“您似乎没有登录到服务器。请打开新窗口并登录以继续。登录后,单击此处检查连接。”。如果收到 403,则显示文本:“您似乎没有足够的权限来完成此操作。”。

我是否正确使用了这些错误代码?

4

1 回答 1

3

您的返回码根本不重要,因为它是 AJAX 请求,因此您可以返回任何您想要的东西。您返回错误代码,然后使用 JS 处理它,然后将消息返回给用户。示例用户单击按钮删除,他/她可能没有这样做的权限,因此您返回 json:状态:错误,类型:权限。然后向用户显示属于此错误类型的消息。

您应该将 1 和 2 组合在一起。编写一个函数或类来检查他们的命令。例子:

$check = $session_check(USER_COMMAND);
if ($check) //has right
else //no right.

function session_check($command){
     $userCmdList = array(COMMAND_1,2,3,4);
     $modCmdList = array(COMMAND_2,3,4,5,6,7);
     switch ($_SESSION['group_id']){
          case "admin":
               return true;
               break;
          case "mod":
               if !in_array($command,$modCmdList) return false;
               else return true;
               break;
          case "user":
               if !in_array($command,$userCmdList) return false;
               else return true;
               break;
          default:
               break;
    }
}

还要记住为每个会话使用唯一的哈希以防止会话 hjhack

P/S:这是遵循您当前工作流程的简单答案。其他改进的方法总是可用的。

于 2011-08-02T09:43:12.693 回答