我正在构建ASP.NET MVC网站,要求管理员需要能够在文件系统中手动创建cshtml文件(在Views当然文件夹),然后能够通过控制器操作访问该页面。 (即创建文件名为Test.cshtml
,然后通过/Content/Test
访问)在ASP.NET MVC动态呈现视图中的安全隐含
我通过以下方式做到了这一点:
首先,自定义路由配置:
routes.MapRoute(
name: "StandardContent", // my controller
url: "Content/{pageName}",
defaults: new {controller = "Content", action = "Render", pageName = UrlParameter.Optional}
);
,然后控制器的行动,以视图名称作为参数,检查所请求的视图名称是否存在,然后呈现该视图:
public ActionResult Render(string pageName)
{
if (pageName.IsNullOrEmpty())
{
return RedirectToAction("Index", "Home");
}
// if no view exists with this name, go 404
if (!this.ViewExists(pageName)) // my extension method for view checking
{
return RedirectToAction("NotFound", "Error");
}
return View(pageName);
}
此作品非常好,除了它的安全性影响之外,我对它感到满意。在这里,我基本上采取任何原始输入用户在URL中写入,并检查视图是否存在与该输入。用户可能会写一些恶意参数,这些恶意参数可能允许他们访问一个文件,该文件通常应该是受限制的访问权限(例如连接字符串文件)?如果是这样,我应该如何防止它?
下面是扩展方法this.ViewExists(pageName)
如果它可以帮助的代码。
public static bool ViewExists(this Controller controller, string viewName)
{
var result = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, null);
return result.View != null;
}
美丽,漂亮,简单,谢谢! :) –