允许 MVC 路由伪造 URL

MVC Routing bogus URLs allowed

我目前正在使用 MVC 路由和 MvcSiteMapProvider。我刚刚注意到一些我不确定的事情:

[Route("mypath/{param1}/{param2}/{param3:int}/", Name = "myaction")]
[MvcSiteMapNode(Title = "My Thing", ParentKey = "myparent", Key = "myaction", PreservedRouteParameters = "param1, param2, param3")]
public ActionResult myaction(string param1, string param2, int param3)
{
    mymodel model = gd.getmydata(param3);
    var node = SiteMaps.Current.CurrentNode;
    node.Title = model.name;
    node.ParentNode.Title = location;
    node.ParentNode.RouteValues["param"] = location;

    return View(model);
} 

我测试的时候url是我设计的:

http://localhost:12345/mypath/param1/param2/param3

但是,如果我在 param2 或 param3 中用乱码乱码 URL,视图仍然可以正确解析。只有改变 mypath 或 param3 才能做到 404:

http://localhost:12345/mypath/drivel/param2/param3
http://localhost:12345/mypath/param1/drivel/param3

我错过了什么吗?我应该在控制器中进行参数验证吗?

路由的 URL 参数中的标记就像变量一样。按照您配置路线的方式,它将始终匹配任何以 mypath/ 开头并包含 3 个附加段的 URL。路由不关心将什么值放入这些段,它会将它们放入名为 param1param2param3 的路由键中,其中包含实际 [=31= 中的任何值].

如果您希望路由 匹配 URL /mypath/param1/param2/param3,您将需要使用文字路由段。

[Route("mypath/param1/param2/param3/", Name = "myaction")]

但是,由于您的 param3 段是一个整数值而您的 URL 包含一个字符串,因此很难说出您要达到的目标。如果你声明它是一个整数,你必须在 URL 中放置一个整数,否则你会得到一个错误。

/mypath/param1/param2/123

如果您在 URL 中使用文字段,则需要注意的另一件事是它们不会转换为路由值,因此在这种情况下无需使用 PreservedRouteParamters

因此,如果您使用变量声明路由,那么任何值都有效也就不足为奇了。如果你想要一个明确的路线,用文字段声明它。如果你想要变量但又想将路由限制在一定范围内的可能值,那么你需要使用路由约束。