Включить проверку основного запроса asp.net

Я что-то упустил или ядро ​​asp.net позволяет публиковать тег скрипта в текстовых полях пользователя? В предыдущих версиях asp.net mvc мне нужно было разрешить его по атрибуту [AllowHtml].

Есть ли способ, как включить проверку против потенциально опасных значений?

Я свободен, чтобы представить значение как

<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>

1 ответ

Решение

В ASP.NET Core нет функции, аналогичной проверке запросов, поскольку Microsoft решила, что это не очень хорошая идея. Для получения дополнительной информации см. Обсуждение проблемы ASP.NET Core " Промежуточное программное обеспечение по умолчанию для проверки запросов, как в IIS".

Это означает, что проверка должна выполняться на входящей модели. И что в Razor (.cshtml) вы должны выводить вводимые пользователем данные как @Model.Content, который кодирует данную строку.

Помните, что эти экранирующие методы могут не работать, если выводимый текст не находится внутри HTML-части.

Так что не используйте @Html.Raw(..) если вы не знаете, что предоставленные данные были продезинфицированы.

Дополнение:

Другие вопросы по тегам