C#MVC:URL中的尾随等号不会到达路由

时间:2009-06-02 19:33:20

标签: c# asp.net-mvc

我有一个像这个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开始。

3 个答案:

答案 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编码,以便处理尾随=。

http://www.albionresearch.com/misc/urlencode.php

答案 2 :(得分:1)

UrlEncode加密(加密,对吧?)参数。

如果是加密字符串,请注意空格和+字符也会妨碍你。


好的,因此IIS 7不会允许某些特殊字符作为路径的一部分。但是,如果它们是查询字符串的一部分,它将允许它们。

显然,有可能通过注册来改变这一点,但我不建议这样做。

然后,我建议使用备用令牌,如Skeet先生所建议的,或者只是不在你的路径中使用它,将它用作查询字符串,你可以在其中对其进行编码。

如果它是加密字符串,您尚未验证它是否存在,在某些情况下您可能会获得其他“非法”字符。 Querystring真的是要走的路。


除了你的样本显示它是查询字符串...那么是什么给出了?你在哪里找到一个不允许标准uri编码作为查询字符串的一部分的IIS?


好的。感谢更新。

RequestFiltering?  我知道了。仍然提到它阻止的双重编码值。有人创建了一个URL序列来拒绝任何带有'%'字符的请求吗?此时你可能根本不想使用加密的字符串,但是生成一个GUID或其他保证不包含特殊字符的东西,但这并不容易猜到。