2013-02-20 68 views
0

我正在構建一個網頁,其中有網頁上的公開內容,但我不希望用戶能夠通過更改直接在URL中的行的id來猜測下一頁是什麼。如何在URL中使用字母數字字符串而不是整數?

我發現here,這樣做的方式是編碼和解碼十進制/座36但使用此方法的問題是,id仍然容易被猜到,如1將保持1,和13將是d,等

什麼是使用更長的散列/字母數字字符串作爲id的最佳做法和方法?有點像YouTube網址,沒有任何碰撞的可能性?

感謝您的幫助和建議,非常感謝。

+0

你可以存儲預哈希ID字符串作爲你的表中的二次「主」鍵,或者你使用可以使用可逆的加密方法,例如aes-> base64 – 2013-02-20 17:24:03

+0

爲你的數字做一個哈希表+添加鹽。比較他們,得到原始數字。 – vikingmaster 2013-02-20 17:24:08

+0

您可以從文章/頁面的名稱創建一個url slug,並將其與數據一起存儲在數據庫中。這也將使從ID過渡到mod_rewrite seo友好的URL更容易。 – 2013-02-20 17:26:48

回答

1

也許最好的想法是用簡單的非線性算法修改散列之前的數字。也許是這樣的:

<?php 

$id = ($_GET['id']*3)+2; 

$id = base_convert($id, 10, 36); 

然後到unhash,只是反轉算法:

<?php 

$id = dase_convert($id, 36, 10); 

$id = ($id-2)/3; 
+0

到目前爲止,這是我最喜歡的解決方案,但我試圖確保沒有碰撞風險。 – 2013-02-20 17:36:30

+0

唯一真正的風險是有人猜測該模式,並丟失新生成的ID之間的值。例如:1變成5,2變成8,3變成11 – 2013-02-20 17:37:44

+0

如果我轉換像1EAFDY(84467302)這樣的字符串,PHP處理是否快?對於更長的URL,我會使用'($ id * 1234)+ 2'之類的東西... – 2013-02-20 17:47:30

0

實施使用GUID作爲您的身份。

GUID(全局唯一標識符)是128位的值,所以如果你想捕捉某人的ID,你就有猜測的可能。

有許多工具可以生成GUID,VS2010有一個實用程序可以將GUID轉換爲純文本格式,但我不知道如何從代碼生成,因爲我從不需要,只能做到一次性使用。

GUID對身份非常有用。 :)

1

您可以加密/解密您的ID而不是編碼。但是,這聽起來像你有一系列必須按順序執行的特定步驟(頁面)。

我相信一個更好的方法是讓業務類確定用戶是否真的被允許(但)看到所請求的頁面。這樣,您可以使用Url上的ID,但依靠您的代碼來確定acccess。