【问题标题】:mvc encoding/decoding the querystringmvc 编码/解码查询字符串
【发布时间】:2018-01-03 19:47:04
【问题描述】:

我正在开发一个 asp.net mvc 6 应用程序,作为应用程序的一部分,我们将发送电子邮件,其中包含一个链接,用户可以单击该链接将它们发送到特定的操作方法。 电子邮件链接的示例是

http://identity.platform:7000/account/register?emailinvitation=true&email=yerg@test.com

然后转到 AccountController 的注册操作方法:

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

我想要的是对 url 进行 Base-64 编码,这样用户就不会想要手动更改任何参数,所以我们有一个类似的链接

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

所以我的 mvc 应用程序中的流程是

  1. 接收请求
  2. 检查是否有url参数需要解码
  3. 如果是这样,解码并发送到适当的控制器/动作方法

我的问题是,我应该在哪里拦截请求并对其进行解码?这应该发生在路由中还是以后的某个地方?然后如何使用适当的参数重定向到操作方法

【问题讨论】:

  • Base-64 不是加密。更改参数将非常容易。
  • 我知道,我只是想防止大多数用户好奇的篡改,这不是一个真正的安全功能
  • 您将在该链接访问您的服务器时验证该链接,如果它无效,那么您可以显示错误消息

标签: c# asp.net asp.net-core-mvc


【解决方案1】:

在服务器上,为特定邀请生成一个 GUID,并将其发送到电子邮件而不是参数中。

您还需要一个重载的注册操作方法,它接受 GUID 字符串。

Register(string guid) {
}

它将从数据存储中获取链接的详细信息(例如电子邮件地址),然后按照您的正常流程继续。

与 base64 不同,任何人都无法将其反转并发现参数,并且用户很难猜出另一个有效的 GUID。您无需担心对它们进行编码和解码,您可以轻松地将它们制作为一次性令牌,这可能对您的业务流程有所帮助。另一个好处是,您不会在服务器日志或用户浏览历史记录中获得敏感数据,例如电子邮件地址,也不会通过 HTTP 明文传输(根据您的示例 URL)。

【讨论】:

  • 如果按照这种方式 - 最好生成随机字符串而不是使用 guid。
  • @Evk 在您看来,我可以问一下为什么吗?例如,如何保证随机字符串的唯一性?
  • 理论上,Guid 不需要是随机的。例如,在旧版本的 Windows 中,guid 是使用网卡 MAC 地址和时间戳生成的。但是,在所有现代版本中 - guid 基本上只是一个随机数。我仍然更喜欢随机字符串而不是随机 guid,主要是因为语义(甚至不考虑我的代码应该在哪个版本的 Windows 上运行)。至于如何保证唯一性——与当前的 guid 完全相同——要生成的不同字符串的数量如此之多,以至于冲突的可能性可以忽略不计,并且可以不考虑在内。
  • 当然我的意思是我更喜欢在自然期望随机字符串的地方使用随机字符串(就像在这种情况下),而不仅仅是代替一般的 guid。
  • 好吧,当我写第一个评论时,我忘记了 guid 现在是随机的,不像以前那样具有确定性。所以你是对的,在这种情况下可能不需要生成随机字符串,我只是习惯了。
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多