2012-06-20 4 views
18

多くのWebサイトがデータベーステーブルで1から増分するのではなく、ランダムIDを使用する理由を知りたいと思います。私は何か良い理由を見つけることなく検索しました。なぜWebサイトはデータベーステーブルでランダムなIDを使用する傾向がありますか?

また、どの方法を使用するのが最適ですか?データを挿入する前にIDがすでに存在するかどうかをチェックするのは非常に非効率的です(2番目のクエリを実行します)。

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

+0

増分値セットに基づくセキュリティ上の脅威を避けるために – swapnesh

+1

インクリメントIDは、トランザクションレートに関する情報がクライアントに公開されている場合に漏洩します。例えば毎日登録する新しいユーザーの数。 –

+2

"random" idまたはGUID id? –

答えて

8

データベースのインクリメンタルIDを使用して行を識別している可能性がありますが、URLパラメータを使用してエンドユーザーに公開される値は、ランダムな文字列になり、オブジェクトを推測することは困難です。

これは実際にはあいまいさによるセキュリティの問題です。増分値を処理してURLを介して攻撃を試みる自動スクリプトが妨げられ、サイトコンテンツの自動スクレーピングが妨げられます。

たとえば、v=HSsdaX4sのような値の代わりにインクリメンタルIDを使用した場合は、単にv=1で始まり、その値を何百万回も増やすだけですべてをダウンロードできます。

+0

インクリメンタルIDのポイントは何ですか?テーブルから行を取得するときは、v = HSsdaX4sを使用します。だから、インクリメンタルIDの必要性は本当ですか? – lawls

+2

@lawls大規模では、整数フィールドを索引付けする計算が節約されることがあります。特に、主テーブルだけでなく、他の多くの関連テーブルではおそらく外部キー列として使用されているためです。本当にインクリメンタルIDは多くの多くのWebフレームワークとORMのデフォルト動作であり、RDBMSのネイティブ動作は自動インクリメントIDを生成し、INSERTの直後にそれらを返すようになっています。したがって、小規模では、ORMを再構成する必要がないという利便性だけが得られます。どちらかの方法で文字列IDを生成するアルゴリズムを記述する必要があります。 –

4

シーケンシャルIDは拡張されません(分散システムでは同期ボトルネックになります)。

また、新しく生成されたランダムなIDがすでに存在するかどうかを確認する必要はありません。そうでないと仮定することができます。

1

IDはランダムですか?またはそれらはコード化されていますか?いずれにせよ、それはセキュリティのためです。

+0

ランダムであるかどうかはわかりませんが、スタックオーバーフローは完全な例です。おそらくidが1の質問はありません。すべての質問には、私が見た限り、8つの数字のidがあります。 –

+0

@piers - [これはどうですか](http://stackoverflow.com/questions/4/when-setting-a-forms-opacity-should-i-use-a-decimal-or-double)または[this 1](http://stackoverflow.com/questions/6/why-doesnt-the-percentage-width-child-in-absolutely-positioned-parent-work-in-i)ちょうど日付で質問を並べ替え、次に行く最後のページ –

+0

@MartinSmithありがとう、私の間違い。 –

関連する問題