1

私は新しい単一ページ Web アプリケーションの構築/設計を開始しており、主にフロントエンドにクライアント側のテクノロジ (HTML、CSS、JavaScript/CoffeScript) を使用し、データを提供するための薄い REST API バックエンドを使用したいと考えていました。フロントエンド。発生した問題は、JavaScript のセキュリティに関するものです。たとえば、ユーザーが割り当てたロールとリソースに応じてのみ表示される特定のリンクと UI 要素があります。ユーザーがログインすると、認証情報を検証する REST 呼び出しが行われ、そのユーザーのすべてのアクセス許可を持つ json オブジェクトが返されます。このオブジェクトは JavaScript オブジェクトに格納されます。

次の JavaScript を見てみましょう。

// Generated by CoffeeScript 1.3.3
(function() {
  var acl, permissions, root;

  root = typeof exports !== "undefined" && exports !== null ? exports : this;

  permissions = {
    //data…
  };

  acl = {
    hasPermission: function(resource, permission, instanceId) {
      //code….
    }
  };

  root.acl = acl;

}).call(this);

このコード設定では、コンソールを介しても、変数のアクセス許可を誰も変更できないようにします。ここでの問題は、これは単一ページのアプリケーションであるため、ページを更新せずにアクセス許可を更新したい場合があることです (おそらく、アクセス許可に追加する必要があるレコードを追加する可能性があります)。私がこれを行うことを考えることができる唯一の方法は、次のようなものを追加することです

setPermission: function(resource, permission, instanceId){
  //code…
}

ただし、それを行うと、ブラウザーコンソールの誰かがそれを使用して、自分が持ってはいけない権限を自分自身に追加することもできます。ブラウザ コンソールからはアクセスできないが、JavaScript ファイルのコードからはアクセスできるコードを追加する方法はありますか?

上記の問題を防ぐことができたとしても、まだ大きな問題があります。hasPermission 機能が必要な場合でも、このように宣言されている場合は、ブラウザー コンソールで次のようにしてそのメソッドを上書きできます。

acl.hasPermission(resource, permission, instanceId){return true;}

そして今、私はすべてを見ることができるでしょう。とにかく、このメソッドをユーザーがオーバーライドできないように定義する方法はありますか (最終的なものとしてマークするなど)?

注意すべきことは、すべての REST API 呼び出しでもパーミッションもチェックされるため、表示されるべきではないものが表示されたとしても、何も実行できず、REST API はパーミッションの問題のために要求を後悔することになります。 . サーバー側でテンプレートを生成するという 1 つの提案がなされましたが、フロントエンドとバックエンドのテクノロジ スタックの間に非常に強い結合が作成されるため、そのアイデアはあまり好きではありません。たとえば、何らかの理由で PHP から Python または Ruby に移行する必要がある場合、テンプレートが JavaScript のクライアント側で構築されている場合、REST API を再構築するだけで済み、すべてのフロントエンド コードはそのまま使用できます。同じですが、サーバー側でテンプレートを生成している場合はそうではありません。

4

3 に答える 3

4

何をするにしても、サーバー側でもすべての権限を確認する必要があります(ご指摘のとおり、REST バックエンドで)。どんな困難を乗り越えたとしても、だれかが行うべきではない REST 呼び出しを行うことができます。

これにより、クライアント側のセキュリティ システムが効果的に最適化されます。許可された操作のみをユーザーに表示し、許可された操作を取得するためにサーバーへのラウンドトリップを回避しようとします。

そのため、ユーザーが「ハッキング」できるかどうかを実際に気にする必要はありません。アプリケーションが壊れた場合でも、両方の部分を保持できます。サーバーは、許可されていないアクションの実行を許可しないため、何も問題が発生することはありません。

ただし、有効な回答として「アクセスが拒否されました」(例外である必要はありません) を期待するように、クライアント側のコードを記述します。この応答が返される理由は多数あります。ログインしているユーザーがブラウザを開いている間にそのアクセス許可が変更された場合、クライアントのセキュリティの説明がサーバーと一致しなくなり、その状況は適切に処理する必要があります (表示 "申し訳ありませんが、この操作は許可されていません」と表示され、セキュリティの説明をリロードするなど)。

于 2012-09-05T13:13:23.137 に答える
2

一般的に、Javascript コードやフロントエンドを信頼しないでください。ブラウザに到達するにコードを変更することもできます (スニファーなど)。ほとんどの変数はアクセス可能であり、とにかく変更可能です...信じてください: フロントエンドで安全になることは決してありません :)

フロントエンドだけでなく、常にサーバー側で資格情報を確認してください!

于 2012-09-05T13:14:50.487 に答える
0

最新のブラウザーでは、Object.freezeorObject.definePropertyを使用して、hasPermissionメソッドを再定義できないようにすることができます。

の問題を克服する方法はまだわかりませんsetPermission。サーバー側のセキュリティに頼るのが最善かもしれませんが、とにかくあなたが言ったように.

于 2012-09-05T13:39:15.110 に答える