Передача строки HTML в метод действия моего контроллера - PullRequest
0 голосов
/ 24 января 2019

Я использую текстовый редактор для ввода форматированного текста, как показано ниже:

enter image description here

Я могу получить текст в формате HTML, который будетвыглядит следующим образом:

<p>This is my rich HTML Text</p>

Теперь я хочу передать этот текст в формате HTML моему контроллеру, и мой контроллер поместит текст в электронное письмо и отправит его получателю.

ПроблемаHTML-строка считается небезопасной, поэтому для ее передачи в мой контроллер мне нужно добавить атрибут [ValidateInput(false)] в мой метод Action, как показано ниже:

    [ValidateInput(false)] // <-- not able to hit the action method without this
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<JsonResult> Contact(string message)
    {
        if (!HttpContext.User.Identity.IsAuthenticated)
        {
            return Json(new { Authorize = "false" });
        }

        // email message to receiver
    }

И это метод Ajax, который связывается сконтроллер:

$('#contactBtn').click(function () {
    var form = $('#__AjaxAntiForgeryForm');
    var token = $('input[name="__RequestVerificationToken"]', form).val();
    var message = quill.root.innerHTML; // <-- HTML formatted message

    $.ajax({
        url: "/Communication/Contact",
        data: { __RequestVerificationToken: token, message: message },
        dataType: 'json',
        type: "POST"
    });
});

Итак, приведенный выше код работает, но я не уверен, что это правильно?Есть ли проблема безопасности с приведенным выше кодом?Есть ли какая-либо кодировка, которую мне нужно сделать в HTML?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Использование [ValidateInput(false)] в методе действия не является хорошим подходом, поскольку могут быть другие входные параметры, которые не проходят проверку ... использование [AllowHtml] работает, если мы передаем модель ...

Для этого сценария мы могли бы сделать то, что объясняется в этом этом руководстве :

Мое решение основано на приведенном выше учебнике, за исключением того, что я добавил логику санации в связыватель модели, что означает, что мы разрешаем ввод HTML, но используем HTMLSanitizer для санации ввода.

Определено пользовательское связующее для модели:

public class AllowHtmlBinder: IModelBinder
{
    // use HtmlSanitizer to remove unsafe HTML/JS from input
    private HtmlSanitizer _htmlSanitizer = new HtmlSanitizer();

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        var name = bindingContext.ModelName;
        var unvalidatedInputMessage = request.Unvalidated[name]; // get the unvalidated input
        var sanitizedMessage = _htmlSanitizer.Sanitize(unvalidatedInputMessage); // removed script or any XSS thread from user input
        return sanitizedMessage;
    }
}

И использовал его по определенному параметру:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<JsonResult> Contact([ModelBinder(typeof(AllowHtmlBinder))] string message)
{
    if (!HttpContext.User.Identity.IsAuthenticated)
    {
        return Json(new { Authorize = "false" });
    }

    // email message to receiver
}
0 голосов
/ 24 января 2019

На самом деле атрибут ValidateInput связан с проблемой XSS (Cross Site Security).

XSS (Cross Site Security) - это атака безопасности, при которой злоумышленник вводит вредоносный код во время ввода данных. Этот код может быть JavaScript, VBScript или любым другим кодом сценария. После того, как код введен в браузер конечного пользователя. Этот код может запускаться и получать доступ к файлам cookie, сеансам, локальным файлам и т. Д.

Теперь хорошая новость заключается в том, что XSS по умолчанию запрещен в ASP.NET MVC. Поэтому, если кто-то пытается опубликовать код JavaScript или HTML с помощью ввода, он попадает со следующей ошибкой.

Потенциально опасное значение Request.Form обнаружено клиентом .....

Но в реальной жизни есть сценарии, в которых HTML должен быть разрешен, как редакторы HTML. Поэтому для подобных сценариев мы украшаем наш метод действия атрибутом ValidateInput следующим образом:

[ValidateInput(false)]
public async Task<JsonResult> Contact(string message)
{

}

Но есть проблема сделать это. Мы разрешаем HTML и скрипт для полного действия, которое может быть опасным. Предположим, что форма, которую мы публикуем, имеет пять входных текстовых полей, теперь все пять текстовых полей могут содержать HTML и сценарии.

Вместо этого Статья Microsoft предлагает:

В приложениях ASP.NET MVC 3 или более поздней версии, когда вам необходимо отправить HTML обратно в модель, не используйте ValidateInput (false), чтобы отключить проверку запросов. Просто добавьте [AllowHtml] к свойству модели, например, так:

public class BlogEntry
{
  public int UserId {get;set;}
  [AllowHtml]
  public string BlogText {get;set;}
}

Итак, суть в том, что ValidateInput позволяет размещать скрипты и HTML на всем уровне действия, в то время как AllowHTML находится на более детальном уровне.

Для получения более подробной информации вы можете прочитать ASP.NET Security - Защита ваших приложений ASP.NET

...