Вы должны принимать только правильно сформированный HTML.
Затем вы можете использовать LINQ to XML для анализа и изменения.
Вы можете создать рекурсивную функцию, которая получает элемент от пользователя и возвращает новый элемент с набором тегов и атрибутов в белом списке.
Например:
//Maps allowed tags to allowed attributes for the tags.
static readonly Dictionary<string, string[]> AllowedTags = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase) {
{ "b", new string[0] },
{ "img", new string[] { "src", "alt" } },
//...
};
static XElement CleanElement(XElement dirtyElement) {
return new XElement(dirtyElem.Name,
dirtyElement.Elements
.Where(e => AllowedTags.ContainsKey(e.Name))
.Select<XElement, XElement>(CleanElement)
.Concat(
dirtyElement.Attributes
.Where(a => AllowedTags[dirtyElem.Name].Contains(a.Name, StringComparer.OrdinalIgnoreCase))
);
}
Если вы разрешаете гиперссылки, обязательно запретите javascript:
urls; этот код этого не делает.