Сохранять и отображать строку HTML, избегая JS, в ASP.Net Core 2 - PullRequest
0 голосов
/ 24 мая 2018

Я хочу сохранить отформатированный текст с помощью редактора Rich-Text (QuillJS), и при отображении обратно он должен отображаться как HTML.По умолчанию представления кодируют HTML, чтобы избежать внедрения JS, и поэтому данные обрабатываются как простая строка.

Как мне удается хранить и отображать / отображать данные как HTML, в то же время одновременнофильтровать какие-либо JS в строке?

Я пытался найти API, но не смог найти никакой помощи.Во-вторых, в наши дни становится все труднее добираться до документации только с именем класса, поэтому полное имя класса высоко ценится в ответах.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Если ваша модель содержит свойство public string MyHtml { get; set; }, то для отображения результатов в представлении используйте

@Html.Raw(Model.MyHtml)

Чтобы определить, содержит ли опубликованное значение какие-либо теги <script>, и / или удалить ихиз значения используйте html-анализатор, такой как Html Agility Pack .Например, в вашем методе POST вы можете добавить ModelStateError и вернуть представление

public ActionResult Save(MyModel model)
{
    if (HasScripts(model.MyHtml)
    {
        ModelState.AddModelError("MyHtml", "The html cannot contain script tags");
    }
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    // save and redirect
}

Где HasScripts() равно

public bool HasScripts(string html)
{
    HtmlDocument document = new HtmlDocument();
    document.LoadHtml(html);
    HtmlNode root = document.DocumentNode;
    return root.Descendants("script").Any();
}

В качестве альтернативы, если вы хотите просто удалить ихперед сохранением вы можете использовать следующий метод

public string RemoveScripts(string html)
{
    HtmlDocument document = new HtmlDocument();
    document.LoadHtml(html);
    HtmlNode root = document.DocumentNode;
    IEnumerable<HtmlNode> scripts = root.Descendants("script");
    for(int i = 0; i < scripts.Count(); i++)
    {
        HtmlNode script = scripts[i];
        script.Remove();
    }
    return scripts.Any() ? document.ToString() : html;
}

и использовать его как

model.MyHtml = RemoveScripts(model.MyHtml);

Примечание. Если у вас возникает желание использовать регулярное выражение для этого, я рекомендую прочитать Регулярное выражение для извлечения тегов скрипта .

Вы также можете рассмотреть возможность проверки других потенциально вредоносных элементов, таких как <embed>, <iframe>, <form> и т. Д.

.
0 голосов
/ 24 мая 2018

Не использовать @Html.Raw(...).Пользователи могут выполнять инъекции Javascript.Существует много библиотек для предотвращения инъекций JS.Я использовал AntiXSS для отображения HTML.

AntiXSS: https://www.nuget.org/packages/AntiXSS/

...