我正在構建一個網頁,其中有網頁上的公開內容,但我不希望用戶能夠通過更改直接在URL中的行的id
來猜測下一頁是什麼。如何在URL中使用字母數字字符串而不是整數?
我發現here,這樣做的方式是編碼和解碼十進制/座36但使用此方法的問題是,id
仍然容易被猜到,如1將保持1,和13將是d,等
什麼是使用更長的散列/字母數字字符串作爲id
的最佳做法和方法?有點像YouTube網址,沒有任何碰撞的可能性?
感謝您的幫助和建議,非常感謝。
我正在構建一個網頁,其中有網頁上的公開內容,但我不希望用戶能夠通過更改直接在URL中的行的id
來猜測下一頁是什麼。如何在URL中使用字母數字字符串而不是整數?
我發現here,這樣做的方式是編碼和解碼十進制/座36但使用此方法的問題是,id
仍然容易被猜到,如1將保持1,和13將是d,等
什麼是使用更長的散列/字母數字字符串作爲id
的最佳做法和方法?有點像YouTube網址,沒有任何碰撞的可能性?
感謝您的幫助和建議,非常感謝。
也許最好的想法是用簡單的非線性算法修改散列之前的數字。也許是這樣的:
<?php
$id = ($_GET['id']*3)+2;
$id = base_convert($id, 10, 36);
然後到unhash,只是反轉算法:
<?php
$id = dase_convert($id, 36, 10);
$id = ($id-2)/3;
到目前爲止,這是我最喜歡的解決方案,但我試圖確保沒有碰撞風險。 – 2013-02-20 17:36:30
唯一真正的風險是有人猜測該模式,並丟失新生成的ID之間的值。例如:1變成5,2變成8,3變成11 – 2013-02-20 17:37:44
如果我轉換像1EAFDY(84467302)這樣的字符串,PHP處理是否快?對於更長的URL,我會使用'($ id * 1234)+ 2'之類的東西... – 2013-02-20 17:47:30
實施使用GUID作爲您的身份。
GUID(全局唯一標識符)是128位的值,所以如果你想捕捉某人的ID,你就有猜測的可能。
有許多工具可以生成GUID,VS2010有一個實用程序可以將GUID轉換爲純文本格式,但我不知道如何從代碼生成,因爲我從不需要,只能做到一次性使用。
GUID對身份非常有用。 :)
您可以加密/解密您的ID而不是編碼。但是,這聽起來像你有一系列必須按順序執行的特定步驟(頁面)。
我相信一個更好的方法是讓業務類確定用戶是否真的被允許(但)看到所請求的頁面。這樣,您可以使用Url上的ID,但依靠您的代碼來確定acccess。
你可以存儲預哈希ID字符串作爲你的表中的二次「主」鍵,或者你使用可以使用可逆的加密方法,例如aes-> base64 – 2013-02-20 17:24:03
爲你的數字做一個哈希表+添加鹽。比較他們,得到原始數字。 – vikingmaster 2013-02-20 17:24:08
您可以從文章/頁面的名稱創建一個url slug,並將其與數據一起存儲在數據庫中。這也將使從ID過渡到mod_rewrite seo友好的URL更容易。 – 2013-02-20 17:26:48