2009-08-25 22 views
1

使用PHP MySQL處理基於Web的「購買和銷售」應用程序,用戶可以在其中發佈項目和服務的廣告。MySQL PHP在網站上顯示之前通過電子郵件驗證廣告/帖子?

在系統上顯示新廣告之前,必須有一種驗證方法,以確保用戶提供的電子郵件地址是正確的,並且該廣告是合法的。

我想向任何新廣告的創建者發送一封電子郵件,其中包含一個指向主要功能是接收發布變量$ advert_id的頁面的URL,刪除。

這個變量嵌入在PHP語法的url中,即 即。 [http://www.example.com?content=modify_advert&advert_id=2246317]

這部分實現起來相當簡單,但是,如果用戶要將這個名爲「advert_id = 2246317」的變量修改爲任何其他整數,他們可以訪問系統中的其他帖子/廣告。

該系統是基於廣告的,用戶不需要帳戶或登錄信息,所以我們不能在驗證點提示登錄,這很方便。

有關如何保護系統中的廣告/帖子無法通過上述url訪問的任何想法?

有什麼建議嗎?

+0

很好的答案小夥子 - 非常感謝... – DJDonaL3000 2009-08-25 00:38:14

回答

1

如果遊客將只觀看從您通過電子郵件發送的鏈接頁面上,可以包括哈希在地址而不是advert_id - 本質上是隨機的,一次性密碼。

生成這樣一個隨機密碼的一個常見和「通常足夠好」的技巧是採用一個單一的,祕密的,真正隨機的字符串(我通常使用grc.com),將它與唯一的advert_id連接起來, ,例如SHA1()。像這樣:

UPDATE advert SET advert_hash = SHA1(CONCAT(advert_id, 'lots-of-randomness-here')) 

你甚至可以通過添加time(),或(更好)的隨機數到最後改變這一點。結果是存儲在數據庫中的40個字符的字符串,沒有人可能預測(不知道用於生成它的祕密數據)。

例如,我可能會得到這個,而不是advert_id=1

f2db832ddfb149522442c156dadab50307f12b62 

如果我想悄悄編輯advert_id=2(其別人創建的),我想首先要猜測散列是這樣的完全不同的字符串:

e5c6a3a9473b814b3230ee7923cbe679fcebc922 

因此,包括在URL中,而不是advert_id(或者,如果你喜歡,除了adve rt_id),突然你的用戶無力毀掉別人的內容。

0

你可以添加一個salt到id然後散列它。

sha1($advert_id . $salt); 

的URL,而不是advert_id發送給用戶,並將其存儲在數據庫中與advert_id一起。

然後,當他們點擊鏈接時,您會發現該哈希值的匹配廣告。

讓鹽成爲一個祕密是如何阻止用戶「猜測」一個有效的URL,以便他們修改他們沒有發佈的廣告。也許你可以使用用戶的電子郵件地址,發佈時間和/或用戶在發佈帖子時輸入的名稱或其他內容。

0

生成一個GUID作爲廣告ID,所以簡單的ID猜測攻擊不太可能成功。