2011-06-28 18 views
0

PHPアプリケーションのメッセージIDをエンコードしようとしていますが、その方法についてはわかりません。phpを使用してURLメッセージIDをエンコードしてデコードする

基本的に私は、例えば、URL持っている - http://www.mymessager.com?messageID=38927648726894762345768

どのようにすることができます - 私は、システムがURLのメッセージIDをコードするが、たとえば、データベースにそれを変更しないでくださいしたいhttp://www.mymessager.com?messageID=1234

をそのようなことをして、誰かがエンコードされたURLに行くとPHPはアドレスバーにhttp://www.mymessager.com?messageID=38927648726894762345768と表示しますが、スクリプトはデータベースからメッセージ1234を取り出しますか?

私はそこに同様の質問があることを知っていますが、私は何をしたいのかについて話すものは見つけられませんでした(主にURLをきれいにすることです)。

答えて

1

これは他のユーザーがmessageID = 4321などのプライベートメッセージを開くことを避けるためですか?ので、この方法は行く方法はありません!

メッセージを開いているユーザーが実際にメッセージを開いていることを確認する必要があります。

メッセージが非公開で、番号を変更してメッセージを増分的に表示しないようにしてください。次に、 'messageKey'フィールドをデータベースに追加し、指定された長さのランダムな文字列を設定することができます。例http://www.mymessager.com?messageKey=jadg23sf34lhs

ここで、そのmessageKeyでメッセージを検索するだけです。 messageKeyが一意であることを確認してください。

このようにして、messageKeyを覚えやすいものに設定したり、SEOを友好的に設定することもできます。ユニークな限り。

0

あなたはハッシュ化している場合(例えばMD5で)値あなたは、ID例えばのハッシュ値を比較することができます

$SQL = "SELECT * FROM `messages` WHERE MD5(ID) = '".$_GET['id']."'"; 
+0

これも可能な方法ですが、塩を追加することを忘れないでください。 – Phliplip

0

これは、通常、データベース内の各エントリのための別のIDを格納することによって行われます。そのルートに行きたくない場合は、 "public" idとの間で変換できる関数を使用する必要があります。 ...

function toPublicId($id) { 
    return $id * 1498158 + 825920496; 
} 

function toInternalId($publicId) { 
    return ($publicId - 825920496)/1498158; 
} 

などです。私は、時にはbase36と大きな乗数+オフセットとの間で変換することによって変換する、パブリックIDに保証されたユニークな英数字IDを使用します。

1

私は実際には文字列にそれらを翻訳:次に

$consts = array(66016,57721, 42344,56714,76422); 
define('BASE', 36); 
$to_encrypt = 5789; 
// Generate a random seed value as an index of the constants 
$seed = rand(0,count()-1); 

// Add the constant the product of the seed and the to the value to be encrypted 
// (the multiplication just serves to create more noise) 
$base_crypt = ($consts[ $seed ] + $to_encrypt * ($seed + 1)); 

//SEE NOTES ON FLOATING POINT ISSUES IN PHP DOCS! 
$encrypted = base_convert(BASE * $base_crypt + $seed, 10, BASE); 

解読:

$encrypted = base_convert($_GET[ 'encrypted' ], BASE, 10); 
$seed  = $encrypted % BASE; 
$decrypted = (($encrypted - $seed)/BASE - $consts[ $seed ])/($seed + 1); 

をあなたはおそらくある程度bcaddなどを使用する必要がありますが、私はの生産コピーを持っていますこのシステムとそれが動作します。

(これは最初に公開した場所にlinkを含める必要があります)。

+0

私は本当にあなたのアイデアが大好き! – cldrr

関連する問題