解码带加号的字符串
Decode string with plus sign
使用 ASP.NET 核心我收到以下令牌(简化):
String token = "Z%2F3+3Q==";
/
使用 %2F
编码。我从客户端使用 Angular.
调用的 URL 收到令牌
我尝试使用以下方法解码令牌:
HttpUtility.UrlDecode(token)
或
WebUtility.UrlDecode(token)
在这两种情况下,%2F
都被我想要的 /
替换了,但是 +
被我不想要的 space 替换了。
如何解码字符串?
更新
客户端应用程序正在发送编码的令牌:
Z%2F3%2B3Q%3D%3D;
但是,不知何故,似乎是以下操作中的标记:
[HttpPut("account/verify/{userId}/{token}")]
public async Task<IActionResult> VerityEmailAddress([FromRoute]AccountEmailVerifyModel model) {
}
转化为:
Z%2F3+3Q==
所以 +
和 =
被解码了,但是 /
没有被解码。
这里的关键是这是作为 路由参数 传递的,未正确解码的特定字符是 /
。正如您想象的那样,在处理路由参数中的 /
时存在一些潜在问题,因为它们通常被视为路由分隔符。
背景
最终,这是 ASP.NET MVC 框架 和现在 [ 的已知限制 =57=]核心。 ASP.NET GitHub site. On #4599 (from 2016), there's a lengthy debate about whether or not this is the correct behavior. On #4445 (from 2019), a contributor from Microsoft committed to providing an option to allow decoding of these parameters.
上对此有不少讨论
不幸的是,这并没有进入 ASP.NET Core 3.1 或 ASP.NET Core 5.0—虽然它仍然开放,但它已从 PRI: 1 - Required 问题降级为 severity-minor 问题。
解决方法
在 Microsoft 提供解决方案之前,可以通过三个选项解决此问题:
- 通过查询字符串传递
{token}
参数,它将被完全解码。
- 将代码添加到您的应用程序中,在
%2F
绑定发生后显式解码。
- 创建您自己的
IModelBinder
以修改模型绑定行为本身。
Update: Contributor @Celluj34 has provided a sample implementation of a custom model binder to solve this on the GitHub issue.
None 其中特别令人满意。但这至少证实了您所看到的行为是已知的和预期的,即使它可能是不正确的。
使用 ASP.NET 核心我收到以下令牌(简化):
String token = "Z%2F3+3Q==";
/
使用 %2F
编码。我从客户端使用 Angular.
我尝试使用以下方法解码令牌:
HttpUtility.UrlDecode(token)
或
WebUtility.UrlDecode(token)
在这两种情况下,%2F
都被我想要的 /
替换了,但是 +
被我不想要的 space 替换了。
如何解码字符串?
更新
客户端应用程序正在发送编码的令牌:
Z%2F3%2B3Q%3D%3D;
但是,不知何故,似乎是以下操作中的标记:
[HttpPut("account/verify/{userId}/{token}")]
public async Task<IActionResult> VerityEmailAddress([FromRoute]AccountEmailVerifyModel model) {
}
转化为:
Z%2F3+3Q==
所以 +
和 =
被解码了,但是 /
没有被解码。
这里的关键是这是作为 路由参数 传递的,未正确解码的特定字符是 /
。正如您想象的那样,在处理路由参数中的 /
时存在一些潜在问题,因为它们通常被视为路由分隔符。
背景
最终,这是 ASP.NET MVC 框架 和现在 [ 的已知限制 =57=]核心。 ASP.NET GitHub site. On #4599 (from 2016), there's a lengthy debate about whether or not this is the correct behavior. On #4445 (from 2019), a contributor from Microsoft committed to providing an option to allow decoding of these parameters.
上对此有不少讨论不幸的是,这并没有进入 ASP.NET Core 3.1 或 ASP.NET Core 5.0—虽然它仍然开放,但它已从 PRI: 1 - Required 问题降级为 severity-minor 问题。
解决方法
在 Microsoft 提供解决方案之前,可以通过三个选项解决此问题:
- 通过查询字符串传递
{token}
参数,它将被完全解码。 - 将代码添加到您的应用程序中,在
%2F
绑定发生后显式解码。 - 创建您自己的
IModelBinder
以修改模型绑定行为本身。
Update: Contributor @Celluj34 has provided a sample implementation of a custom model binder to solve this on the GitHub issue.
None 其中特别令人满意。但这至少证实了您所看到的行为是已知的和预期的,即使它可能是不正确的。