Если ваша модель содержит свойство 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>
и т. Д.
.