0

管理者とゲストの 2 つのユーザー クラスを持つサイトがあります。予想通り、管理者は通常のゲストがアクセスできない特定の機能にアクセスしています。現在、管理者/ゲストを分離するユーザー フラグ (管理者/ゲスト) は、X:Y 形式で Cookie に保存されます。ここで、X はユーザー フラグ (管理者の場合は 1、ユーザーの場合は 2)、Y はその一意のユーザー ID です。データベース内のユーザー。

権限昇格は、Cookie の「X」を変更することで実行できます。したがって、これが起こらないようにする方法があるかどうか疑問に思っていますか?タイ!

4

3 に答える 3

6

アクセス許可をクライアントに保存しないでください。ユーザーの認証に必要な情報を保存します (一般的に言えば、これはセッション ID を意味します)。サーバーで承認レベルを処理するために必要なすべてのデータを保持します。

于 2012-11-30T00:15:35.593 に答える
2

ユーザー (管理者/ゲスト) のロールをデータベースに保存し、ログイン時にセッションに配置する必要があります。

このようなもの:

$authUser = authenticateUser($email, $password);
//if authentication successful :
$_SESSION['role'] = $authUser['role'];

次に、次のように権利を確認できます。

function isAdmin() {
  return $_SESSION['role'] == 'admin';
}
于 2012-11-30T00:21:13.430 に答える
2

あなたの方法は、複数のセキュリティ上の脆弱性にさらされています: 誰でも管理者アクセスを取得でき、侵入者 (非管理者、非ゲスト) が Cookie 値を変更して自分自身を完全に誤認することができます。Quentinとpinouchonの答えに基づいて、セッションを使用してユーザーアクセスレベルを制御する必要があります...これは、クライアント側にフラグを保存するよりも常に安全です。このように、クライアント側に保存される唯一の値はセッション ID であり、これを使用して既存のセッション値を取得するか ( $_SESSION['privilege_level'])、ユーザー権限のデータベースに対して使用できます。

これを投稿することさえ少し気が進まないのですが、何らかの理由でセッションを絶対に使用できない場合は、少なくとも、暗号化されていない/ハッシュされた Cookie 値を送信しないようにする必要があります。セッションを使用するほど安全ではありませんが、 X:Y:Z のようなものを保存できます。ここで、 x は暗号化されたユーザー ID、 Y は暗号化された許可フラグ、 Z は X,Y,User Agent を含む巨大な塩漬けハッシュです。 、IP など。次に、ユーザーが何かを行うたびにハッシュを再作成し、それが Cookie のハッシュと一致することを確認します (これにより、誰かが他の誰かの役割を引き継ぐのが少し難しくなり、さらに難しくなります)ユーザーが自分の役割を手動で変更できるようにします。

于 2012-11-30T00:31:50.537 に答える