允许 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。路由不关心将什么值放入这些段,它会将它们放入名为 param1
、param2
和 param3
的路由键中,其中包含实际 [=31= 中的任何值].
如果您希望路由 仅 匹配 URL /mypath/param1/param2/param3
,您将需要使用文字路由段。
[Route("mypath/param1/param2/param3/", Name = "myaction")]
但是,由于您的 param3
段是一个整数值而您的 URL 包含一个字符串,因此很难说出您要达到的目标。如果你声明它是一个整数,你必须在 URL 中放置一个整数,否则你会得到一个错误。
/mypath/param1/param2/123
如果您在 URL 中使用文字段,则需要注意的另一件事是它们不会转换为路由值,因此在这种情况下无需使用 PreservedRouteParamters
。
因此,如果您使用变量声明路由,那么任何值都有效也就不足为奇了。如果你想要一个明确的路线,用文字段声明它。如果你想要变量但又想将路由限制在一定范围内的可能值,那么你需要使用路由约束。
我目前正在使用 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。路由不关心将什么值放入这些段,它会将它们放入名为 param1
、param2
和 param3
的路由键中,其中包含实际 [=31= 中的任何值].
如果您希望路由 仅 匹配 URL /mypath/param1/param2/param3
,您将需要使用文字路由段。
[Route("mypath/param1/param2/param3/", Name = "myaction")]
但是,由于您的 param3
段是一个整数值而您的 URL 包含一个字符串,因此很难说出您要达到的目标。如果你声明它是一个整数,你必须在 URL 中放置一个整数,否则你会得到一个错误。
/mypath/param1/param2/123
如果您在 URL 中使用文字段,则需要注意的另一件事是它们不会转换为路由值,因此在这种情况下无需使用 PreservedRouteParamters
。
因此,如果您使用变量声明路由,那么任何值都有效也就不足为奇了。如果你想要一个明确的路线,用文字段声明它。如果你想要变量但又想将路由限制在一定范围内的可能值,那么你需要使用路由约束。