php - 更正 HTML 状态代码以防止未经授权的访问和禁止的访问。 (使用 Ajax )

标签 php html ajax unauthorized

我的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 ,给出为 answer另一个问题。

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

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

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

最佳答案

您的返回代码根本不重要,因为它是 AJAX 请求,因此您可以返回任何您想要的内容。返回错误代码,然后使用 JS 处理它,然后将消息返回给用户。示例用户点击删除按钮,他/她可能没有执行此操作的权限,因此您返回 json: status: error, type:permission。然后向用户显示属于该错误类型的消息。

您应该将 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;
    }
}

还记得为每个 session 使用唯一的哈希值以防止 session hjhack

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

关于php - 更正 HTML 状态代码以防止未经授权的访问和禁止的访问。 (使用 Ajax ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6909270/

相关文章:

php - PHP:设置 session 时,数据未插入数据库吗?

javascript - 在javascript中隐藏列

jquery - 解析json字符串以获取jQueries getJSON方法提供的同类对象

python - 使用 Ajax 验证并提交 Django 表单 (django-crispy-forms)

javascript - 如何在提交后不离开页面的情况下通过电子邮件发送用户输入

php - 取消选中先前选中的复选框时删除行

PHP - 在未定义的数组索引上使用 += 运算符

php - 如何使用mysql的replace()函数

jquery - 滚动时动画元素

html - ie6阴影问题