我的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/