我有一个像这个www.example.com/Find?Key=
的MVC路由,Key是一个Base64字符串。问题是Base64字符串有时会有一个尾随等号(=),例如:
huhsdfjbsdf2394 =
当发生这种情况时,由于某种原因,我的路线不再受到打击。
我该怎么做才能解决这个问题?
我的路线:
routes.MapRoute(
"FindByKeyRoute",
"Find",
new { controller = "Search", action = "FindByKey" }
);
如果我有http://www.example.com/Find?Key=bla
那么它就可以了。
如果我有http://www.example.com/Find?Key=bla=
,那么它就不再有用了。
重要添加:
我正在写一个不允许%或类似编码的IIS7实例。这就是为什么我没有使用UrlEncode开始。
答案 0 :(得分:3)
编辑:显然不起作用的原始建议
我确定原因是它认为它是一个名为 Key的查询参数。你能把它作为一个参数,那个部分是值,例如
www.example.com/Find?Route=Key=
我期待可以工作(因为解析器会寻找&
来启动下一个参数)但是它可能会让事情变得混乱。
我认为可行的建议
或者,将base64编码值中的“=”替换为出路处的其他内容,并在返回途中重新替换它,如果你明白我的意思。基本上使用不同的base64 decodabet。
应该有效的替代建议
在将base64添加到网址之前:
private static readonly char[] Base64Padding = new char[] { '=' };
...
base64 = base64.TrimEnd(Base64Padding);
然后在入站请求中调用Convert.FromBase64String()
(这是我假设您正在做的事情)之前:
// Round up to a multiple of 4 characters.
int paddingLength = (4 - (base64.Length % 4)) % 4;
base64 = base64.PadRight(base64.Length + paddingLength, '=');
答案 1 :(得分:2)
如果您在URL中传递数据,您应该对其进行URL编码,以便处理尾随=。
答案 2 :(得分:1)
UrlEncode加密(加密,对吧?)参数。
如果是加密字符串,请注意空格和+字符也会妨碍你。
好的,因此IIS 7不会允许某些特殊字符作为路径的一部分。但是,如果它们是查询字符串的一部分,它将允许它们。
显然,有可能通过注册来改变这一点,但我不建议这样做。
然后,我建议使用备用令牌,如Skeet先生所建议的,或者只是不在你的路径中使用它,将它用作查询字符串,你可以在其中对其进行编码。
如果它是加密字符串,您尚未验证它是否存在,在某些情况下您可能会获得其他“非法”字符。 Querystring真的是要走的路。
除了你的样本显示它是查询字符串...那么是什么给出了?你在哪里找到一个不允许标准uri编码作为查询字符串的一部分的IIS?
好的。感谢更新。
RequestFiltering? 我知道了。仍然提到它阻止的双重编码值。有人创建了一个URL序列来拒绝任何带有'%'字符的请求吗?此时你可能根本不想使用加密的字符串,但是生成一个GUID或其他保证不包含特殊字符的东西,但这并不容易猜到。