2

私の 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 を受信した場合、「この操作を完了するための十分な権限がないようです。」というテキストが表示されます。

これらのエラー コードを正しく使用していますか?

4

1 に答える 1

3

戻りコードはまったく重要ではありません。これは 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;
    }
}

また、セッション hjhack を防ぐために、各セッションに一意のハッシュを使用することを忘れないでください

P/S: これは、現在の作業プロセスに沿った簡単な回答です。他の改善された方法は常に利用可能です。

于 2011-08-02T09:43:12.693 に答える