web-dev-qa-db-ja.com

重要なデータは開発者コンソールから変更できます。私は何をすべきか?

シナリオ:サーバー側でエンコードされたJSONを使用してJavaScriptで生成されたタスクリストがあります。 todoアイテムIDをHTML id属性に入れました。したがって、プロセスは次のようになります。

  1. サーバー側のコードはtodo配列を作成します。
  2. 配列をJSONにシリアル化する
  3. JSONオブジェクトの配列をループして、todoリストをレンダリングします。

次に、特定のタスク項目を編集して更新する必要があります。これは次のように行われます:

  1. オブジェクトを取得するためにHTML id属性値から取得したto-do IDを比較することにより、JSONオブジェクト配列をIDでフィルタリングします。
  2. AJAXを使用して、オブジェクトをINSERT.PHPページに渡します。
  3. INSERT.PHPページで、JSONをデシリアライズしてデータベースで更新できるようにします。

Problem:ユーザーがブラウザの開発者コンソールを使用してTo-DoアイテムIDを変更できるため、HTML ID属性にTo-DoアイテムIDを入力すると、システムに問題が発生します。

質問:安全な方法はありますか?私はそれを間違っているのですか、それともこれは普通のことですか?

30
user3079341

質問の詳細のほとんどは無関係です。 IDがHTML id属性に格納されていること、開発者ツール、jQueryを使用していること...それは本当に重要ではありません。

重要なのは、サーバーにinsert.phpというエンドポイントがあることだけです。攻撃者は、クライアントコードがどのようなものであっても、エンドポイントに攻撃者が望む任意の要求を送信できます。許可されていないことを実行しようとする人々に対する保護は、クライアントではなくサーバーで行う必要があります。

PHPコードを見てください。入力が期待した形式であることを確認していますか?ユーザーが特定のタスクリストを編集する権限を持っているかどうかを確認していますか?そうでない場合は修正してください。また、セキュリティの値を得るには、検証と承認のチェックをサーバーで実行する必要があることに注意してください。

具体的には、ユーザーが自分が所有するToDoの編集のみを許可する必要がある場合は、insert.phpで以下を実行する必要があります。

  • データベースを照会して、変更中のタスクの所有者を取得します。
  • リクエストを行っているユーザーのIDを取得します。
  • それらが同じであることを確認し、そうでない場合は拒否します。
160
Anders

AJAX説明した関連事項は重要ではありません。クライアント(ブラウザ)を信頼してはならず、insert.phpスクリプトで情報を検証する必要があります。

何を検証するかを検討する必要があります。ToDoリストの場合は、送信したID、変更などの関連する権限があることを確認してください。誰かが手動でinsert.phpスクリプトにリクエストを送信する場合、それが必要とするものすべてに対応する必要があります(つまり、自分に属しているかどうか、/それを編集するためのアクセス許可を持っているかどうか、ToDoリストアイテムかどうか)ロックされているなど)。

クライアント/ブラウザが送信するデータを信頼して、サーバーサイドですべてを検証することは絶対に避けてください。 JSONオブジェクトを挿入するだけのように見えるinsert.phpスクリプトではなく、検討することもできます。検証せずにJSONオブジェクトを挿入するだけでなく、AJAXリクエスト用のAPIを作成できます。それについて何か。

3
Jack