我正在構建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;
}
美麗,漂亮,簡單,謝謝! :) –