2012-03-28 2 views
5

URLにDBの内部IDを公開するのは悪い習慣ですか?DBの内部IDをURLに公開するのは悪い習慣ですか?

たとえば、各行にいくつかのID(主キー)を持つusersテーブルがあるとします。 URL myapp.com/accountInfo.html?userId=5が公開されます(5は実際のプライマリキーです)、「悪い」とみなされ、その理由は何ですか?

また、SQLインジェクションを適切に防御しているとします。

私は主にJava Webテクノロジスタック(Javaタグ)に関する回答に興味がありますが、一般的な回答も非常に役立ちます。

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

答えて

7

URLを解析する方法に基づいています。ブラインドSQLインジェクションが悪い場合は許可してください。ユーザー入力からIDを検証するだけで済みます。

Stackexchangeはアドレスバーに表示されているように、行のIDをURLに入れます。トリックは、パーツを解析して、すべての可能なSQLを取得することです。シンプルな方法は、idが数字であることを確認することです。

+0

はい。私たちが注射に対して適切に防御しているとしましょう。 – Simeon

+0

この場合、「ユーザーフレンドリー」のURLを使用しないと、おそらく何の問題もありません。 – rekire

+0

正確に私の意見、ありがとう。 – Simeon

7

エンドユーザーにあまり意味を持たないので、URLをパススルーするのは悪いことではありません。アプリケーションの実行中にその値に頼るのは唯一悪いことです。たとえば、ユーザーがuserId = 5を認識してuserID = 10に変更して、別のユーザーのアカウントを表示しないようにしたいとします。

この情報をサーバー上のセッションに格納する方がはるかに安全です。たとえば、ユーザーがログインすると、そのユーザーIDの値がサーバーのセッションに格納され、データベースに照会するたびにこの値が使用されます。このようにすれば、通常はURL内のuserIDを渡す必要はありませんが、DBクエリーコードで使用されていないため害はありません。

0

このIDはオブジェクト(db行)の人生で決して変更しないでください。したがって、URLは耐久性があります - URLの最も重要な側面です。 Cool URIs don't changeも参照してください。

+0

投票者は彼の意見を説明できますか? – deamon

+0

これは非常に役に立ちました、ありがとう – Simeon

+0

非常に間違っています。これを行うとすぐに、データベースが変更の障害になります。 –

2

はい、それは悪いことです。あなたは実装の詳細を公開しています。どんなに悪い?場合によります。ユーザー入力の不要なチェックを強制します。それに応じて他のアプリケーションが起動する場合、データベーススキームを自由に変更することはできません。

+0

IMOの主キーは、本番環境では一度変更できません。本番環境にいなくても、他のテーブルが依存している可能性があるため、変更することはできません。一般に、私は主キーを変更することで得られる利益は見られません。ユーザーに(URLナビゲーションをすべて使用している場合)表示するには、URLに何らかのパラメータが必要であるため、いくつかの実装の詳細を公開する必要があります。 – Simeon

+0

@シメオン:もちろんプライマリキーが変わります。特に、データモデルを再設計するとき。私は滝の文脈で働かない。データベースへのマッピングをどのクライアントにも公開しないでください。私は別のストレージ層を使いたいかもしれません。 –

0

PKはシステムを意味します。
ユーザーには、異なる意味を表すことがあります。
リンクをたどることを考えてみましょう。プライマリキーを使用すると、商品の下に商品が表示されます
productA、productB、productC;リンクB

(A)http://blahblahsite.com/browse/productA/111(PKEY)
(B)http://blahblahsite.com/browse/productB/112(PKEY)
(C)http://blahblahsite.com/browse/productC/113(PKEY)
ユーザ112個の項目があると感じるかもしれ誤解を招くようなProductBの下にある。

また、PKが自動インクリメントされるため、テーブルをマージする際に問題が発生します。

+0

URLはユーザーエクスペリエンスの一部ではないと思います。私が何かを開発していない場合、誰もURLをもうタイプしません。私は自分自身に注意を払っていません。だから誤解を招くという事実は私にはあまり関係ないようです。しかし、私は自動インクリメントの議論に同意する。 – Simeon

+0

stackexchange URLを見ると、DB関連ではない場合は誤解を招くいくつかの数字も含まれています。 – Simeon

関連する問題