2009-07-02 46 views
2

私は、整数のPKを持つ顧客がいます。私のウェブアプリケーションでは、私はそれらのためのプロフィールページを持っていたい。私は/ profile/10375 /のようなURLは必要ありません(たとえば、私が持っている顧客の数を他の人に知らせたくないなど)。私はまた、/ profile/acme_corp /のようなスラグベースURLを望んでいません。整数から一意の短い文字列を取得するには?

一意の整数を一意のランダムな短い文字列に変換するにはどうすればよいですか? (たとえば、以前のRedditではこのタイプのURLを使用していましたが、いくつかのIDをスキップして、小数から基数36への変換でした)。しかし、それもこのスキームでDBのエンティティの数を推測するのは簡単なので、私にとっては有用ではありません。

URLを大きくしすぎるため、UUIDなどを使用できません。

+0

本当にこのようにしたい場合は、生成された文字の組み合わせが攻撃的な単語と同じかそれに非常に似ていないようにしてください。がんばろう! –

+0

明確にするために、プロファイルは公開されています。 主な理由私はこれを行うには、 1.誰かがすべてのプロファイルを見るために次の次を行うことはできませんまたはボットがすべてのURLなどを推測することはあまりにも簡単にします。 2.顧客の数を維持する公開情報になる。 – agiliq

答えて

2

短い文字列(8文字、0-9a-f)を生成するハッシュアルゴリズムがあります。例えば、adler32またはcrc32です。 PHP function hash()(利用可能なアルゴリズムの一覧についてはを参照)を使用してそれらを生成することはできますが、DBエンジン自体がそれを処理できるかどうかはわかりません。その場合、ランダムなスラグを生成する方が良い解決策になります。

ハッシュ時に塩を追加すると安全です。

+0

彼は、はるかに長い出力を持つハッシュ関数を使用して、最初のNバイトだけを取ることもできます。 –

+0

最初のNバイトは一意である必要はありません –

0

いつでもbase64でURLのエンコードができます。 PHPで

urlencode (base64_encode("1234")) 
> MTIzNA%3D%3D 

base64_decode(urldecode("MTIzNA%3D%3D")) 
> 1234 
6

主な関心事は、一人の顧客は、私はあなたが提案している方法に依存しません別の顧客のページで見ることができるということであるならば。最終的には、それは「暗闇を通した安全保障」です。私は代わりに、ページの表示を顧客の認証証明書に結びつけます(ユーザーにログインを要求する場合)。顧客が自分以外のプロフィールページにアクセスしようとすると、ログインページにリダイレクトされるか、アクセス許可エラーメッセージが表示されます。

実際、URLにcustomerIDを入れる必要はありません。ただ、使用/プロフィール/

+1

+1あなたは正しいです。これを行う正しい方法です、ちょうど/ profile/ –

+0

これは答えです。多分それは私だけですが、これはとても明白です! –

+1

OPは、誰か他の人のプロフィールを見ることができるかどうかという問題は実際には述べていません。引用された唯一の問題は、そこにいるユーザーの数が何であるかを人々に知らせたくないということです。他のプロファイルを見ることができない場合、これは素晴らしい解決策です。そうでない場合... – bdukes

0

多分あなたは、各桁のアルファベットの文字のランダムな組...

1

からのマッピングでルックアップテーブルを作成することですこれを行う最も簡単で安全な方法をasociateことができ顧客IDを固有のランダムな文字列に変換します。

関連する問題