2016-08-21 103 views
9

我錯過了什麼或asp.net核心允許在用戶文本字段中發佈腳本標記?在之前版本的asp.net mvc中,我需要通過[AllowHtml]屬性來允許它。啓用asp.net核心請求驗證

有沒有辦法讓驗證再次發生潛在的危險值?

我可以自由的形式郵寄過程中像

<script src='http://test.com/hack.js'></script> 

提交值。

型號:

using System.ComponentModel.DataAnnotations; 

namespace Test.Models 
{ 
    public class TestModel 
    { 
     [MaxLength(500)] 
     public string Content { get; set; } 
    } 
} 

控制器:

using Microsoft.AspNetCore.Mvc; 
using Test.Models; 

namespace Test.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public IActionResult Index() 
     { 
      var model = new TestModel { Content = "Test" }; 
      return View(); 
     } 

     [HttpPost] 
     public IActionResult Index(TestModel model) 
     { 
      if(!ModelState.IsValid) 
       return View(model); 

      return Content("Success"); 
     } 
    } 
} 

查看:

@model TestModel 

<form asp-action="Index" asp-controller="Home" method="post"> 
    <div asp-validation-summary="All"></div> 
     <label asp-for="Content">Content<strong>*</strong></label> 
     <span asp-validation-for="Content"></span> 
     <input asp-for="Content" type="text" /> 
    </div> 
</form> 
+0

這是一個很好的問題。我還沒有遇到這個問題。 ASP.NET Core中的所有東西都是選擇加入的,所以我非常肯定你需要將它作爲中間件添加,但我不確定它是否已經被移植到了其中。希望我錯了。 –

+0

在System.Web中有一個名爲'System.Web.CrossSiteScriptingValidation'的類,它似乎持有確定請求是否無效的邏輯。看起來很簡單,快速一瞥。也許這可以用來敲除一些中間件,如果還不存在的話。 –

+1

似乎可能requestvalidation已被刪除,因爲我們不應該依賴它來保證安全性,相反,我們應該驗證輸入並編碼不受信任的輸出http://forums.asp.net/t/2032496.aspx?Where+is+AllowHtml –

回答

6

ASP.NET核心沒有類似Request validation一個功能,因爲微軟決定,它的不是一個好主意。 欲瞭解更多信息,請參閱有關ASP.NET核心問題'Default middleware for request validation, like IIS has'的討論。

這意味着驗證必須在入站模型上進行。在剃刀(.cshtml) 中,您應該輸出用戶提供的輸入,如@Model.Content,它對給定的字符串進行編碼。

請注意,輸出的文本不在Html部分內時,這些轉義技術可能無法正常工作。

所以使用@Html.Raw(..),除非你知道提供的數據已被消毒。

補充:

  • 你可能要考慮一個Web Application Firewall(WAF) 針對惡意請求(例如XSS或SQL注入)的通用保護。
  • 爲了保護您的用戶免受XSS攻擊,您可能還會看到 提供了一個Content Security Policy(CSP)。