18

私はしばしば、内部データベースのプライマリキーを選択ボックスのようなフォームを通して公開するWebアプリケーションに出くわします。そして、時々、ロジックを切り替えるintまたはguidのマジック値とのjavascriptのマッチングを参照します。ウェブアプリケーションのソースにプライマリキーを公開しないようにしますか?

Webアプリケーションの行の内部識別子をすべて漏らさないようにして、外部の人がシステムを理解しすぎてシステムを悪用しないようにすることをお勧めします。もしそうなら、この問題を解決する最良の方法は何ですか?

ウェブアプリケーションに他の値を公開して、主キーに戻すことはできますか?

おかげ

編集

完璧な世界では、あなたが物事を隠さ場合、それは問題ではないように、あなたのアプリケーションは、100%安全であるでしょう。明らかにそれは事実ではありませんので、私たちは注意の側面で間違いを犯し、この情報を公開してはいけませんか?

StackoverflowがおそらくUrlのキーを公開している可能性が高いと指摘している人がいます。ただし、エンタープライズアプリケーションの考慮事項は異なりますか?

答えて

24

対問題。ユーザーの目に見えるようにするのは、通常は避けようとしているシステム外の意味があるため、問題になる可能性があります。

しかし、コンボボックスのリスト項目の値としてIDを使用するには?それのために行く私は言う。中間値との間で変換を行う点は何ですか?あなたは一意のキーを使用する必要はありません。このような翻訳は、バグの可能性をさらに高めます。

セキュリティを無視しないでください。

ユーザーに6個のアイテム(ID1〜6)を提示すると、その値だけをユーザーから戻すことはできません。誰かがID 7を返信してセキュリティを侵害しようとする可能性があります。したがって、引き返したものが許可されていることを確認する必要があります。

しかし、それは完全に避けてください。とんでもない。必要なし。

別の回答のコメントには、ここのURLをご覧ください。これには、間違いなくSOデータベースの質問の主キーが含まれます。技術的に使用するためにキーを公開するのはまったく問題ありません。

また、サロゲート値を代わりに使用すると、必ずしもより安全なわけではありません。

+4

+1私は同意します。何かのIDを表示しないようにするために、任意の値を使用すると、セキュリティスルー難読化(せいぜい)があります。あなたのセキュリティは、値を偽ったユーザーを拒否するのに十分強くなければなりません。 – nickf

+0

...グリッドを生成するために使用されるテーブルの行を表すDBから得られたPKについてはどうでしょうか? – JPCF

+0

@nickfパスワードを平文の代わりにハッシュとして 'security-through-obfuscation'として保存することを検討しますか? – Medorator

3

すべての質問にはいっています。 "は、ウェブアプリケーションに他の値を公開して、主キーに戻すことができると同意します。"

これ以外の場合は、潜在的な問題を解決することができます。

編集

というコメントについて「は些細なキーのペナルティヒットを取る理由はない。今、ブラウザのURLで見て、私はあなたがキーを参照してください賭ける!」。

私はあなたが言っていることを理解しています。はい、私はSO URLのキーを見て、おそらくデータベースPKを参照していることに同意します。私はこのような場合には、より良い選択肢がないと大丈夫だと認めています。

私はまだPK以外の何かを公開することを好みます(意味値を持つもの)。質問のタイトルはURLにも含まれていますが、これは一意であると確認するのが難しいため(または口頭でユーザー間をやりとりする)、信頼できるものとしては使用できません。

ただし、「タグ」URL(つまりhttps://stackoverflow.com/questions/tagged/java+j2ee)を見ると、PKは公開されず、代わりにタグ名が使用されます。個人的には、私はそのアプローチを好み、そのために努力します。

また、PKポイントが時々変更できるデータを追加したいと考えました。 DBテーブルの内容が月末に削除され、新しいデータで再投入された毎月の統計など、オフラインプロセスの情報でテーブルがいっぱいになったシステムで作業しました。

データが異なる順序でデータベースに追加されると、特定のデータポイントのPKが変更され、前の月の保存されたブックマークがそのデータに異なるデータセットを指すようになります。

これは、PKを公開するとアプリのセキュリティとは無関係にアプリを「中断」するケースの1つです。生成されたキーではそうではありません。

+2

これは絶対的なことではないため、簡単なキーにペナルティヒットを行う理由はありません。あなたのブラウザのURLを今見て、私はあなたが鍵を見て賭ける! –

+1

セキュリティ・フローが表示されない、またはサロゲート・キーを好む理由がわかりません。さらに、あなたが与える例はちょうど悪いデザインです。 – andho

3

はい、公開鍵は攻撃として使用できる情報です。特に予測可能な場合。

機密情報と思われる場合は、別のキー/列を使用してください。

どのようにあなたが持っているユーザーは、検討することを示す回避するために、例えば

:私は主キーを暴露することであるとの立場に反対

site.com/user/123をsite.com/user/username

0

いつものように、「それは依存する」。 (時間/日/月)ごとに実行しているトランザクションの数を知って誰かが価値を得ることができ、単調に増加しているトランザクションIDを公開している場合、それはリスクです。

他の人が言ったように、値のドロップダウンリストでは、通常問題はありません。

0

プライマリキー以外の値を公開しても、セキュリティをチェックする負担はありません。実際に、セキュリティに穴がある場合、悪意のあるユーザーは、URLの値を変更することによって意図しないオブジェクトにアクセスする可能性があります。彼らは使用する価値の手がかりが少ないかもしれませんが、値をランダムに選ぶと運が良いかもしれません。

このようにセキュリティを向上させたい場合は、idの代わりにURLに大きなランダムな文字列(推測が難しい)を使用し、乱数に一致する間接的な表を使用する必要がありますバックグラウンド。

私はそれがほとんどの時間の面倒の価値がないと思う。

これは、ユーザーパスワードを変更するためのページを公開したり、ログインを必要としない場合(パスワードを忘れたユーザーなど)のように、「暗黙のセキュリティ」が必要な場合に便利です。このような場合は、有効期限の日付をキーに関連付ける必要があります。

0

主キーは、サロゲートキーまたは内部キーと同じではありませんが、重複があります。内部キーの反対側は自然キーです。自然キーが主キーとして使用されることは何度もあります。私たちがプライバシーの問題を扱っていない限り、一般に、自然の鍵を隠す理由はありません。

あなたの本当の疑問は、内部キーをユーザーに公開するかどうかということです。答えは「それは依存している」。ほとんどのユーザーコミュニティでは、内部キーを公開すると、そのキーが自然なキーとして使用されるようになります。これは、内部キーとテーブル行のサブジェクトとの間の1対1のマッピングが壊れた場合、混乱を招く可能性があります。

この内訳は、データの誤った管理の結果として発生する可能性があります。しかし、ほとんどの場合、実際の世界で発生しているデータの不具合を計画する必要があります。あなたは、水の不備があるときはいつでも故障する給水システムを計画しません。データミスマンメントが起こるたびに情報システムが崩壊するとは考えていません。

これまで、ほとんどのデータベース設計者はソフトウェアベンダーのために働いていて、製品のユーザーによるデータのミスマッチに起因する問題は認識していません。

関連する問題