5

クライアント側の JavaScript を要点として動的な Web アプリケーションを構築することは可能ですか? 私はサーバー側のJavaScript(ノードなど)について話しているのではなく、ほとんどのサイトをjavascriptで処理することについて話している:テンプレート化、フォーム処理など.

もちろん、短い答えは「はい、可能です」です。しかし、私の主な関心事は、データベースが伝統的にサーバー上にある場合のデータベースのデータ操作とセキュリティです。クライアント側の JavaScript 駆動型アプリケーションは、理想的には、データベースとほぼ直接対話する必要があります。Couchdbがこれを許可していることは知っていますが、ユーザーが表示を許可されるべきではないデータを表示するためのクエリを送信できないようにするにはどうすればよいですか? メインの検証もクライアント側であり、簡単に偽造する必要があることを考慮して、入力の検証を処理する方法は?

これは私には非常に興味深いように思えますが、実際には実行可能ではありませんが、私が気付いていないソリューション、または一部のデータベースをラップする小さなセキュリティレイヤー、または無視するプロジェクトなどがあるかもしれません.

私は CouchDb Standalone アプリ ( couchapp )を認識しています。これは私が求めているものに近いテクノロジーですが、考えられるすべてのシナリオに理想的ではないオープンなアプローチを強制します。

このトピックに関する提案は大歓迎です。

EDIT : 例が必要なので、simples ブログで考えてください。最新の 5 つの投稿をフロント ページに表示したいと考えています。誰かが非常に簡単な方法でページを「ハッキング」すると、古い投稿を取得できます。それはいいです。しかし、新しい投稿を挿入したいときはどうすればよいですか? JavaScript がデータベースへのオープン アクセスを許可している場合、誰でも私のブログに投稿を書くことができます。また、誰でも私の投稿や他のユーザーのコメントを削除できます。これは私が望む特権です。また、500 文字を超えるコメントや悪い言葉を含むコメントを避けたい場合はどうすればよいでしょうか? 繰り返しますが、クライアント側での検証であるため、ユーザーはそれをバイパスできます。

4

3 に答える 3

3

まず、クライアントでコードを実行してデータベースに直接アクセスするのは面倒に思えます。これは、より複雑なシステムの設計に非常に役立ってきた情報隠蔽の考え方そのものに反しているようです。

したがって、これのほとんどは学術的な演習であると思います。:)

ほとんどの集中型データベース システムには、複数のユーザーまたは役割があります。通常、アプリケーションごとに 1 つの「ユーザー アカウント」を使用し、アプリケーションが独自の方法でユーザーを定義できるようにします。(これは常に私を悩ませてきました。管理者とユーザーの役割データベースで分離する必要があるように常に感じていました。しかし、私の意見では、私は一人のようです。:)

ただし、ロールとデータベース内のロール、ロールに対する権限、およびロールに対する権限を定義することはできます。adminuserGRANT SELECTuserGRANT SELECT, UPDATE, INSERTadmin

PostgreSQL には、少なくとも;PUBLICの代わりになる定義済みの定義があります。user次の例は、http : //www.postgresql.org/docs/9.0/static/sql-grant.html からコピーしたものです。

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;

ファイルを正しく構成すると、ユーザーは特定の IP からログインpg_hba.confでき、ユーザーは他の場所からログインできるため、特定の IP だけに制限することができます。adminuserUPDATEINSERT

ここで問題となるのは、JavaScript で PostgreSQL クライアント ライブラリを作成することです。:) 正直なところ、ブラウザベースの JavaScript 仮想マシンが、リモート ホストとの任意のソケット通信を可能にするほど柔軟かどうかはわかりません。(WebSockets がこれほど熱心に受け入れられていることを考えると、JavaScript は HTTP の世界にとどまっていると思います。)

もちろん、何らかの方法で HTML ページを Web ブラウザに提供する必要があり、それは HTTP サーバーを持つことを意味します。そのサーバーをクライアントとデータベースの間に配置するように依頼することもできます。また、サーバー上でいくつかの処理タスクを実行して、冗長/不要なデータをクライアントにも送信しないようにすることもできます...これがまさに今日の状況です。:)

于 2011-05-19T23:31:04.327 に答える
2

はい、JavaScript に大きく依存する Web アプリケーションを作成することは可能です。ただし、ほとんどの場合、このレイヤーは単なる追加です。交換品ではありません。世の中のほとんどの開発者は、JavaScript をエンドユーザーにとってトランザクションを「簡単」にする便利なレイヤーにすぎないと考えており、それがセキュリティ面での最善のアプローチであると言えます。順応性のあるデータを信頼できるデータベースにサニタイズするための「決定的な」ツールとしての JavaScript は、効率的ではありません。すべてのデータを安全でないものとして扱い、表示するたびにサニタイズし、JavaScript 自体から処理する場合を除きます。

ファンシー アニメーション、AJAX、検証、計算は、通常、利便性のためだけに存在し、サーバーよりもクライアント プロセッサを使用する方が良い場合があるという考えの下にあります。そしてもちろん、物事を「より速く」することは、56k インターネット接続以来、誰もが達成したいと望んでいたことです。

セキュリティに関して言えば、エンド ユーザーが利用できる追加の保護層を持たないセキュリティ ロジックを持つことは、正気ではありません。JavaScript をエクストラ ハンドと考えてください。JavaScript が読み取れるものは、ユーザーが読み取ることができます。データベース資格情報やパスワードハッシュキーをそこに保存することはありませんか? 特に、JavaScript はデバッガーを使用して実行中に変更することができ、難読化されたほとんどすべてのコードを人間が判読できるものに解決できるためです。

その挿入と「安全な」データは別として、ソースが安全であれば、公開されている情報を取得するのにそれほど問題はないはずです。

JavaScript フロントエンドについては、Backbone.jsをお勧めします。これにより、組織と相互作用の面で強固な基盤が得られます。

Backbone は、キーと値のバインディングとカスタム イベントを備えたモデル、列挙可能な関数の豊富な API を備えたコレクション、宣言型イベント処理を備えたビューを提供することで、JavaScript を多用するアプリケーションに構造を提供し、RESTful JSON インターフェースを介して既存のアプリケーションにすべて接続します。

残された唯一のことは、挿入時にデータをサニタイズし、いかなる状況下でも公開できない機密情報を保存/計算するために、DB (または db 自体) の上に置くことができる薄いレイヤーを持つことです。クライアント。

アップデート

ブログの例

あなたがやりたいことをするための3つの本当の要件。

  1. 認証 (バックエンド) : これは、データベースへのアクセス、コメントの消去などに必要です。
  2. 検証とサニタイズ (バックエンド) : 文字数を制限し、悪意のあるコードを回避し、単語を禁止します。
  3. 機密データの処理 (バックエンド) : パスワードにハッシュを使用する...

注: データを表示するときにすべてのデータを安全でないものとして処理することで、「検証とサニタイズ」をほぼ回避できます。私が言及したように、クライアントを安全にするために何らかの形で解析する必要があるため、非常に非効率的です。そして、それがバイパスされる可能性は依然として非常に高いです。他の 2 つは、貴重なデータベースとやり取りするための安全な方法が必要です。

通常: バックエンドに障害が発生すると、フロントエンドにも障害が発生します。およびその逆。XSS は、JavaScript でルール化されたサイト (たとえば Facebook など) に多大な損害を与える可能性があります。

于 2011-05-19T19:37:25.520 に答える
-3

クライアント側からデータベースと通信することはできません。セキュリティのため、および検証を行うには、2回実行する必要があります。クライアント側で1回、サーバー側で1回。

クライアント側でできることはすべて、悪意のあるユーザーによって偽造される可能性があります。クライアント側の検証は、主にユーザーの便宜のために行われます。データベースのセキュリティを提供するのはサーバー側の検証です。

于 2011-05-19T19:34:48.950 に答える