2017-12-18 188 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