私の PHP+JS+Ajax アプリケーションでは、ユーザーがログインする必要があり、ログイン データを $_SESSION に保存します。
ユーザーには、ユーザー、モデレーター、管理者の 3 種類があります。それぞれが以前よりも多くの権利を持っています。
すべてのクエリは 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();
}
最初の質問: 私はこれを正しく行っていますか?
2 番目の質問
アプリケーションが管理者向けのコマンドを発行しないように保護したいと考えています。
次に、次の機能があります。
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);
2 番目の質問: 最初のケースで 401 を返し、2 番目のケースで 403 を返すのは正しいですか? 基本的に、403 は「禁止」を意味し、 http://en.wikipedia.org/wiki/List_of_HTTP_status_codesによれば、 「要求は正当な要求でしたが、サーバーは応答を拒否しています。401 Unauthorized 応答とは異なり、認証中違いはありません。」別の質問への回答として提供されたhttps://dev.twitter.com/docs/error-codes-responsesも確認しました。
ユーザーがすでにログインしている場合、彼/彼女はおそらく管理者アカウントを持っていないため、私にとっては403が正しいようです。さらに、私がプログラミング エラーを起こしたり、ユーザーが Ajax 経由で送信されたデータをハッキングしたりしない限り、ユーザーはこれを見るべきではありません。
注意すべきもう 1 つの点: ユーザーには 401 または 403 ステータス コードが表示されません。これらは、適切なエラー メッセージを表示するために Ajax および JavaScript によって使用されます。401 を受信した場合、JavaScript は次のテキストを表示します。403 を受信した場合、「この操作を完了するための十分な権限がないようです。」というテキストが表示されます。
これらのエラー コードを正しく使用していますか?