私は新しい単一ページ 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 を再構築するだけで済み、すべてのフロントエンド コードはそのまま使用できます。同じですが、サーバー側でテンプレートを生成している場合はそうではありません。