2017-12-18 243 views
2

我正在開發一個asp.net mvc 6應用程序,作爲應用程序的一部分,我們將發送電子郵件,其中包含一個用戶可以點擊的鏈接,將它們發送到特定的操作方法。 一份電子郵件鏈接的一個例子是mvc編碼/解碼查詢字符串

http://identity.platform:7000/account/register?emailinvitation=true&[email protected]

然後會去的AccountController註冊操作方法:

Register(string userName, bool emailInvitation=false, string email="") 

我想什麼是做一個鹼基64編碼的URL,所以用戶不會再試圖手動改變任何參數,所以我們有一個鏈接,如

http://identity.platform:7000/account/register?url=ZW1haWxpbnZpdGF0aW9uPXRydWUmZW1haWw9eWVyZ0B0ZXN0LmNvbQ==

所以在我的MVC應用程序,流量爲

  1. 接收請求
  2. 檢查,如果存在需要進行解碼
  3. 如果這樣解碼,併發送URL參數到適當的控制器/操作方法

我的問題是,我應該攔截請求並解碼它嗎?如果這種情況發生在路由中,或者稍後發生?然後,我如何重定向到具有適當參數的操作方法

+4

Base-64不是加密。這將是很容易改變參數。 –

+0

我知道,我只是想防止對大多數用戶的好奇篡改,它不是一個真正的安全功能 – jazza1000

+0

如果它無效,你將驗證該鏈接,當它擊中你的服務器的權利,那麼你可以顯示錯誤信息 – Saineshwar

回答

2

在服務器上爲特定邀請生成一個GUID,然後在電子郵件中發送該GUID而不是參數。

您還需要爲接受GUID字符串的Register操作方法重載。

Register(string guid) { 
} 

它將從數據存儲獲取鏈接的詳細信息(如電子郵件地址),然後繼續按正常的過程。

與base64不同,任何人都無法反轉它並發現參數,並且用戶很難猜測另一個有效的GUID。您不必擔心編碼和解碼,您可以輕鬆地製作一次性令牌,這可能對您的業務流程有所幫助。另一個好處是,您不會收到敏感數據,例如服務器日誌或用戶瀏覽歷史記錄中的電子郵件地址,或通過HTTP傳輸(如您的示例URL)。

+0

如果關注這樣 - 最好是生成隨機字符串,而不是使用guid。 – Evk

+0

@Evk我可以問你爲什麼?例如,如何保證隨機字符串的唯一性? – ADyson

+0

理論上,Guid不是必須是隨機的。例如,在Windows的舊版本中,guid是使用網卡MAC地址和時間戳生成的。但是,在所有現代版本中 - guid基本上只是一個隨機數。我仍然更喜歡在隨機引導上隨機字符串,這主要是因爲語義(甚至不會考慮我的代碼預計運行在哪個版本的Windows上)。至於如何保證獨特性 - 與目前的guid完全相同 - 要生成的不同字符串的數量非常高,以至於碰撞機率可以忽略不計,並且可以不予考慮。 – Evk