0

Web アプリケーションのセキュリティを開発する方法について質問があります。すべての JavaScript コードが公開されており、誰でも便利そうなパラメーターを使用して AJAX 呼び出しを直接実行できると仮定すると、データベースのステータスを直接変更する呼び出しは非常に危険です。

つまり、「changePoints」または「updateUserState」として呼び出しを行うと、悪意のあるユーザーは、たとえばゲームのロジックを破って、無制限のお金やポイントを取得することができます。

この問題に対する私の直感的な解決策は、クライアントとサーバーを通信する呼び出しを設計して、そのパラメーターを介してアプリのロジックを壊すことができないようにすることです。ゲームの例では、「buySomething」のような呼び出しは安全です。なぜなら、サーバーはその「何か」を追加し、それにかかるお金を差し引く責任があるからです。「addSomething」「changeMoney」という 2 つの呼び出しは同じタスクを実行できますが、明らかな理由から安全ではありません。

私の疑問は、この推論が私を導くという結論から生じます。クライアント側の MVC パターンのモデル部分は、特に「アクティブ レコード」を適用する場合、AJAX 呼び出しがデータベース サーバーに直接相関するため、非常に危険に見えます。また、私の直感的なソリューションでは、アプリケーション ロジックの多くがサーバー側で開発される傾向があり、面倒になる可能性があります。

足りないものはありますか?よりスマートなソリューションはありますか? クライアント側でモデルとアクティブ レコードを使用することは安全ではありませんか?

ご清聴ありがとうございました。

4

1 に答える 1

1

サーバーは常に最終的な権限を持ちます。アプリのロジックはすべてサーバー側に必要であり、サーバーはユーザーが実行するすべてのアクションを検証する必要があります。サーバーは、すべてのアプリケーション ロジックを表すブラック ボックスと考えてください。そのブラックボックスの外にあるものは信頼できず、「アプリ」の一部ではありません。そのブラックボックスを使用して「外部から」実行できるものは、定義上、信頼されていません。ブラック ボックスは、有効な API のみを外部に公開し、無効な入力に反応して拒否する必要があります。HTML/Javascript インターフェイスは、通常のユーザーが操作できる API を使用するための便利な方法にすぎません。これはコア アプリケーションの一部ではなく、重要なビジネス ロジックを含めることはできません。ブラックボックスの中で何が起こっているかを表しているだけです。

アプリケーションが非常に動的で、ゲームのようにインターフェイスに反映する必要がある状態を頻繁に変更する場合、サーバー側の状態との同期を維持することは非常に困難な場合があります。それにもかかわらず、それは必要です。

于 2012-11-22T10:25:08.647 に答える