1

Cakephp 1.3 アプリケーションを使用していますが、「データ漏洩」セキュリティ ホールに遭遇しました。うまくいくものだけでなく、ケーキを使った最善の解決策を探しています。このアプリケーションは、教師が成績を入力し、生徒が自分の成績を取得できる成績追跡システムです。すべてが期待どおりに機能していますが、セキュリティの監査を開始したときに、基本的な CRUD 操作にリークがあることがわかりました。生徒 X が生徒 Y の成績を確認できることを意味します。生徒は自分の成績のみを表示する必要があります。この質問は読み取り操作に限定します。

Cake を使用して、次のビュー関数を含む grade_controller.php ファイルを作成しました。

function view($id = null) {
   // Extra, not related code removed
   $this->set('grade', $this->grade->read(null, $id));
}

http://localhost/grade/view/5

$id=5 の生徒の成績を表示します。それは素晴らしいことです。しかし、生徒 #5 が URL を操作して 6 に変更すると、生徒 #6 の成績が表示されます。古典的なデータ漏洩セキュリティ ホール。

これを解決する最善の方法について、2 つの考えがありました。1) コントローラーで呼び出されるすべての CRUD 操作にチェックを追加できます。または 2) モデルにコードを追加して (たとえば、beforeFind() を使用)、人物 X がそのデータ要素にアクセスできるかどうかを確認します。

オプション #1 は、時間がかかり、エラーが発生しやすいようです。オプション#2が最善の方法のようです。ただし、一部の操作の前に find() を呼び出す必要がありました。上記の read() の例では beforeFind() は実行されず、 beforeRead() コールバックもありません。

提案?

4

2 に答える 2

2

コントローラーにジェネリックを含める代わりに、read()すべての検索、クエリなどをそれぞれのモデルに移動する必要があります。

次に、各モデルを調べて、制限が必要な検索結果に必要なタイプのセキュリティ チェックを追加します。1) はるかに DRY コーディングになり、2) すべてのクエリがどこに保持されているかがわかるため、このようなセキュリティ リスクをより適切に管理できるようになります。

あなたの例でgetGrade($id)は、モデルでメソッドを作成し、フィールド(または何でも)をAuthユーザーIDに対してGradeチェックしますstudent_idCakeSession::read("Auth.User.id");

is_owner()複数のメソッドで同じロジックを再利用するために、同様の汎用メソッドを構築することもできます。

于 2013-04-05T16:20:04.393 に答える
0

CakePHP が isAuthorized をサポートしている場合、次のことができます。

ユーザーのタイプ (「学生」、「教師」など) を持つ列を作成します。

ユーザーのタイプが「学生」の場合、データのみを表示するようにアクセスを制限できます。isAuthorized の例は次のとおりです。私は学生が自分のプロフィール情報のみを編集できるようにしています。概念を拡張できます。

if ((($role['User']['role'] & $this->user_type['student']) == $this->user_type['student']) {
      if (in_array($this->action, array('view')) == true) {
                $id = $this->params->pass[0];
                if ($id == $user_id) {
                    return (true);
                }
            } 
        }
}
于 2013-04-06T06:28:58.963 に答える