簡體   English   中英

如何使此登錄/重定向方法更安全

[英]How to make this login/redirect method more secure

我有一個向用戶發送電子郵件的應用程序,每個電子郵件都包含用戶必須訪問的頁面的鏈接。

鏈接是唯一ID +隨機數的md5。

鏈接看起來像: www.domain.com/index.php?id_page=<the md5>

在索引頁面上,我將$_GET["id_page"]在會話變量$_SESSION["id_page"] ,並將用戶重定向到他必須看到的頁面(僅當鏈接時,用戶才被重定向到該頁面)包含id_page )。

如何改進此方法並使其更安全? 如何保證用戶輸入為其指定的頁面,並且不能輸入其他頁面?

您可以在URL中添加他們的電子郵件。 某人猜測別人的電子郵件和相關哈希的概率僅為0。

您在這里關心的只是時間問題,而不是安全性問題:)。 如果您允許任何人猜測無限數量的id_page值,那么在給定足夠的時間后,最終將有人偶然遇到一個有效的id_page值。

對此的唯一真正的防御措施是增加哈希的長度,使它在隨機有效的id_page上(平均數月或數年)花費(平均)更多的時間。 這可以通過使用sha256或sha512而不是md5來完成。

另一種方法是,如果某人在id_page值上有3次連續不正確的猜測,則將他們鎖定一段時間。 這將大大減少它們在給定時間段內可以嘗試的值的數量。

最后,如果用戶在重定向時已經登錄,那么您也可以將生成的哈希存儲在數據庫表中。 這樣,您可以將特定的哈希映射到表中的一個且只有一個userid。 如果用戶嘗試訪問數據庫中不對應的哈希頁,則可以將其重定向到其他位置。

一種可以很好地防止猜測ID號的方法是在ID中添加某種填充,然后將其轉換為base32。 當然,這並不能消除完全猜測ID的能力,但是對於任何偷窺的人來說,確實要花費更多的時間。

如果您具有URL www.domain.com/index.php?id_page=1,則可以將ID轉換為應用程序中唯一的內容,例如:

填充的id = id x 9-2

7 = 1 x 9 - 2
16 = 2 x 9 -2
25 = 3 x 9 - 2

然后,您可以將新的填充ID轉換為以32為基

7 = G4
16 = GE3A
25 = GI2Q

然后,新的URL將是(ID為1):

www.domain.com/index.php?id_page=G4

使用此方法,如果有人猜到1-6的基數32,它將返回404,因為您的ID 1實際上正在被填充成7。猜測8-15不會返回已解析的ID,因為下一個ID 2填充到16,依此類推。

這不僅使查詢字符串的大小變小,而且沒有使用明顯的MD5哈希,該哈希很容易使用字典順序瀏覽。

如果您希望頁面鏈接到特定用戶,那么沒有理由不能將更多值附加到新的padded_id(我們稱其為哈希)。

例如,如果您有一個ID為12的用戶,並且只希望該用戶能夠訪問ID為10的頁面,則需要創建一個包含以下兩個值的哈希值:

page_id(10)-user_id(12),使用上面的示例,將產生:

(10 x 9 - 2) (12 x 9 - 2)
88-106
HA4A-GEYDM

現在,您有了一個不錯的小型散列鏈接,該鏈接可以固定到單個用戶ID。 上面的示例中的padding方法非常簡單,但是它為您提供了解決問題的整體思路。

不要理會散列或創建唯一的ID或其他任何東西。 復雜性不會幫助您。

相反,只需生成一個隨機令牌,然后使用它即可。 256位隨機令牌應該足以完成您需要做的任何事情。

因此,使用mcrypt (核心擴展):

$token = strtr(
    base64_encode(mcrypt_create_iv(256/8, MCRYPT_DEV_URANDOM)), 
    '+/', 
    '-_'
);

這將為您提供字母a-zA-Z0-9-_的44個字符的結果,其中包含256位隨機熵。

無需哈希結果或其他任何東西。 隨機數據就足夠了。

要了解原因,您需要了解生日問題

基本上具有256位隨機值,要使2個令牌發生沖突的可能性為1%,您需要生成4.8e37個令牌(48個后跟36個0)。

為了獲得10e-18的碰撞機會(通常被視為安全的),您需要生成4.8e29令牌。

由於這些數字比您生成的數字多得多,因此兩個令牌碰撞的機會非常小。

另一個問題是人們猜測令牌。 好吧, MCRYPT_DEV_URANDOM使用底層操作系統的隨機池。 這意味着人們比猜測這里生成的令牌更有可能猜測您的“唯一ID和隨機數”。

因此,簡而言之,只需使用隨機令牌並完成:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM