web-dev-qa-db-ja.com

権限のため、ユーザーはUIからWebページに移動できませんが、URLを貼り付けることでページに移動できます。どうすればこれを防ぐことができますか?

私のアプリケーションでは、ユーザーは権限を持つ特定の役割を持っています。これらの権限により、ホーム画面で使用できるUI要素が決まります。要素の多くは他のページにリンクしていますが、多くのユーザーは、そのWebページへのアクセスが許可されていないため、多くのユーザーには表示されません。

たとえば、button1というボタンは、アプリケーションのランダムなページにリンクしています。たとえば、http://www.example.com/example.jspとしましょう。ただし、ユーザーJohnには、button1の表示を許可しない権限が設定されています。したがって、ジョンはhttp://www.example.com/example.jspに行くことができません。

私が抱えている問題は、Johnとしてサインインし、そのURLを貼り付けると、ページに移動することです。

明らかに、たとえば攻撃者が管理者ページへのURLを取得した場合、これは大きなセキュリティリスクになります。では、どうすればこれを防ぐことができますか?すべてのページのユーザーを確認し、アクセス許可を確認して、そこへのアクセスが許可されていることを確認する必要がありますか?

このアプリケーションには数百のページがあり、すべてのページにコードを含めるのは非常に冗長で効率的ではないようです。今述べた方法よりも簡単な方法はありますか?

69
Michael

すべてのページでユーザーを確認する必要がありますか?

もちろんです。すべてのページだけでなく、特権リソースへのすべてのリクエスト、たとえばPOSTデータの更新、削除、表示などのリクエストなど。ページを表示するだけでなく、制御することもシステムで何ができるか。

現在の実装では、認証と権限のシステム全体が壊れているようです。これを修正するための手順は、この1つの回答には広すぎます。フレームワーク(JSP、ASP.Net、PHPなど)に適したソリューションを見つけるには、このフォーラムとより広いネットを一般的に検索する価値があります。ほとんどのフレームワークには、この問題を解決するためのすぐに使える機能があります。

良いスタートは、OWASPからのこの高レベルのガイドです: 運用セキュリティ:管理インターフェース

345
Trickycm

あなたが集まったように、簡単な答えはイエスです。しかし、それはあなたが考えている巨大な仕事である必要はありません。 (全体のセキュリティは大きいかもしれませんが、これはその一部にすぎません)。あなたはそれよりもはるかに深刻な問題を抱えています。

なぜそれが重要なのか

あなたが作成したものは何でも、それを壊そうとする試みに打たれます。誰かが気になるでしょう。誰かがあなたが決して期待しなかった、あなたの考えに反する何かをします。誰かが好奇心が強い、または悪意のある、またはノジーになります。

ソフトウェア/ Webアプリwill自動化ツールによって厳しくテストされることも当然のことと考えるべきです。 (ほとんどすべての種類の)オンラインポータルを備えたサーバーは、最初にオンラインになってから数十分以内にハッカーによって発見され、thousandsの可能性のあるセキュリティの失効または監視について調査され始めます。つまり、「舞台裏」で正確に実行されているものと、悪用される可能性のある検出可能な失効(データ検証、クロススクリプト検証、SQLまたはバイナリインジェクション、JavaScriptハッキング、バックエンド自体、何かを強制的に失敗させたり、どのデータを公開できるかなどにより、弱点が生じることがあります...).

Webサーバーwill可能なWebコードとバックエンドの失効がないかどうか、この方法で常に数千の自動化ツールを使って数百とは言わないまでも調べられます。それは人間とユーザーだけでなく、それでもありません。

むしろこれは道のりの先であり、批評家、メディア、怒りのユーザーによって力強くあなたの注意を引いたのでしょうか、それとも責任につながりましたか?それともあなたはそれを修正しますか?

解決方法

それはある意味で大きな仕事ではありません。セキュリティフレームワークを作成し、各ページでそれをインポートまたは使用します。そうするための概念は難しくなく、十分に文書化されています。したがって、ページ数はそれほど重要ではありません。

ジョブの難しい部分は、セキュリティがhardであることです。あなたの本当の問題は、これらの問題が存在し、これらの質問をしているという事実から、あなたが助けなしでそれを実行する希望を持っていることを十分に知らないということです。真剣に。君は。行う。ない。

チームの規模やリソースはわかりません。あなたはそれを必要としています-そしておそらくあなたは外部の助けなしでそれを行う望みはありません。

私の本当の懸念はここに

とはいえ、私の本当の関心はWebアプリではありません。この質問が示唆する考え方です。

アプリの購入または使用を検討しているところを想像してみてください。

セキュリティを後付け、作業の中断、または後で修正するための不便さとしてセキュリティを考慮していることは、読者を助けたり、安心させたりしません(または、これまでのところ、そのように扱ってきたほど十分に理解していません)。 、そしておそらく問題は、ボタンのURLを適切にコーディングするなど、本当に基本的なことです。

セキュリティisあなたの仕事です。製品/サービスが技術的に素晴らしいものであり、そのユーザーが誰であっても、あなたのreal製品は、あなたが私のニーズに対処し、大災害を引き起こします。

私は私のデータであなたのアプリを信頼することになっていますか?今、申し訳ありませんが、私自身もGoogle+で公開したいと思います。はい、それはis "それは悪い"状況と印象であり、これは効果を過大評価しているわけではありません。

申し訳ありません。

さて、あなたのアプリが何か良ければ、誰か他の人を巻き込んでください。

38
Stilez

checkser permission level for every request(GET、POST、PUT、DELETE)が必要です。あなたの場合のように、ページを閲覧することはGETリクエストです。ユーザーは、許可なくリクエストを投稿することもできません。

アプリケーションの各ページにコードを追加する必要があるかどうかは、アプリケーションフレームワークによって異なります。たとえば、一部のフレームワーク(Laravel、Express.JS)では、ルートをグループ化し、そのルートの各リクエストにフィルターを適用できます。ここでチェックを行います。プレーンなPHPのアプリケーションの場合、各ページにコードを配置する必要があります。「include」ステートメントを使用して、コードのブロック全体の繰り返しを最小限に抑えることができます。

28
Silencer310

以前にも言われましたが、はい、すべてのページでユーザーの資格情報を確認する必要があります。たとえば、サイトでPHPを使用している場合、これを行う最も簡単な方法は、ログインしたユーザーとその特権レベルをセッション変数に保存し、コードの先頭でこれらのセッション変数の検証を行うことです。これらは、ログアウト(これらの変数をワイプするログアウトロジックを作成した場合)またはセッションタイムアウト(タイムアウトの時間は定義できますが、デフォルトは非アクティブな状態で5分だと思います)でワイプされるため、権限のないユーザーがアクセスできないようにする必要がありますページ。他のテクノロジーでも同様の処理が行われます。

私が言ったとき、私は本当に腹を立てるように言うつもりはないので、その観点からそれを見ないでほしいと思います、しかしこれは一種のパンとバターの情報です。どういうわけかこれを学んでいないか、または自習でこれに遭遇しなかった場合は、これに注意して、この特定の主題についてもう少し詳しく読むことを強くお勧めします。この種の同様のアプリケーションでは、これを何度も繰り返します。

シンプルで効率的な方法でこれを行うにはさまざまな方法があることに注意してください。私があなたに個人的に提案するのは、独自のロジックでコーディングを練習して、それがどのように機能するかを完全に理解してから、フレームワーク。いくつかのアクセス方法に対してそれをテストし、満足したら、さまざまなフレームワークがユーザーセッション処理を実行する方法を調べることができます。

[〜#〜] edit [〜#〜]:下のコメントにこれを付けましたが、これは実際にはOPにも役立つリソースです: https://www.w3schools.com/php/php_sessions.asp

7
psosuna

ユーザーは、アドレスを入力するかリンクをクリックするかに関係なく、ページに移動できないようにする必要があります。

問題に対する一般的な解決策は、役割ベースのアクセス制御(RBAC)アプローチを使用することです。異なるグループを作成し、同等の権限を持つユーザーを対応するグループに割り当てます。同様に、Webページやその他のリソースを異なるフォルダー内にグループ化します。それぞれが特定のグループによって所有されています。私は、軽量Webサーバーを備えた組み込みLinuxを実行しているシステムでこれを達成するためにchgrp(変更グループ)を使用しました。 Stack Overflow で述べたように、.htaccessファイルを配置してアクセスを拒否することにより、Apache Webサーバーでも同じことが実現できます。

UI要素については、異なるページを作成する必要があります(またはグループチェックによって要素を非表示にします)。ユーザーを識別し(ログインして対応するグループを決定)、ユーザーの権限ごとにWebページを表示する必要があります。

3
Majid Khan

あなたは何百ものページについていくつかの懸念を持っていたので、実装に関する簡単な提案。たとえば、ASP.NET MVCでは、他のすべてが継承できるグローバルフィルターまたは「ベース」ページを作成できます。

次に、中央に配置されたコードは、ユーザーコンテキスト/セッションをチェックし、現在のページの権限/権限/グループメンバーシップのリストと比較します(各ページのデータ構造またはページ名に基づくデータベース参照など)。等。)。

1
Jester

他の答えは非常に一般的でした。 [〜#〜] jsp [〜#〜] ページが言及されたのでこれを追加します。したがって、Javaで作業していると想定できます。

そのため、アプリケーションに対してリクエストが行われるたびにコードを実行するために Filters を使用することができます。 Spring のようなセキュリティフレームワークを使用する場合、誰がアクセスできるURLを設定できます。

1
Readin