MgSoftDev.KnowledgeHub.HtmlSanitizer
1.0.0
dotnet add package MgSoftDev.KnowledgeHub.HtmlSanitizer --version 1.0.0
NuGet\Install-Package MgSoftDev.KnowledgeHub.HtmlSanitizer -Version 1.0.0
<PackageReference Include="MgSoftDev.KnowledgeHub.HtmlSanitizer" Version="1.0.0" />
<PackageVersion Include="MgSoftDev.KnowledgeHub.HtmlSanitizer" Version="1.0.0" />
<PackageReference Include="MgSoftDev.KnowledgeHub.HtmlSanitizer" />
paket add MgSoftDev.KnowledgeHub.HtmlSanitizer --version 1.0.0
#r "nuget: MgSoftDev.KnowledgeHub.HtmlSanitizer, 1.0.0"
#:package MgSoftDev.KnowledgeHub.HtmlSanitizer@1.0.0
#addin nuget:?package=MgSoftDev.KnowledgeHub.HtmlSanitizer&version=1.0.0
#tool nuget:?package=MgSoftDev.KnowledgeHub.HtmlSanitizer&version=1.0.0
MgSoftDev.KnowledgeHub.HtmlSanitizer
Limpieza de HTML por defecto para MgSoftDev.KnowledgeHub, sobre la librería HtmlSanitizer (Ganss.Xss).
Quita la basura que mete Word al pegar (<o:p>, class="MsoNormal", <v:shape>,
comentarios condicionales <!--[if …]>), scripts y manejadores de eventos, conservando las
dos formas de imagen que usa KnowledgeHub.
Registro
services.AddKnowledgeHubHtmlSanitizer();
Regístralo en cada contenedor que lo necesite: el de la UI limpia al pegar, el que ejecuta el core limpia al guardar. En WASM eso significa cliente y servidor de la API.
⚠️ En WASM hay dos contenedores y es fácil configurar solo uno. El editor limpia en el cliente y el guardado ocurre en el servidor. Si configuras únicamente el cliente, todo se ve perfecto en pantalla y el servidor —aún con las reglas de fábrica— recorta el HTML camino de la base de datos. Falla al guardar, lejos de donde tocaste nada. Declara las opciones una vez y pásalas a los dos (ver abajo).
El método usa
TryAddSingleton, así que una llamada sin configurar hecha antes gana sobre la tuya y tu configuración se pierde en silencio. Regístralo una sola vez por contenedor.
Es opcional: sin él, la librería funciona igual que antes y no se limpia nada.
Qué añade sobre la configuración de fábrica
Cuatro ajustes que no son opcionales para contenido de KnowledgeHub:
| Ajuste | Por qué |
|---|---|
AllowedSchemes.Add("data") |
Las imágenes pegadas viajan como data: hasta que se guardan; sin esto se borrarían antes de poder subirse. |
AllowedSchemes.Add("docimg") |
docimg://{pk} es la referencia almacenada; sin esto, limpiar al guardar borraría todas las imágenes existentes. |
AllowedCssProperties.Add("zoom") |
zoom no es estándar y no está en la lista de fábrica, pero es lo que escribe la herramienta de tamaño de imagen. |
AllowedAttributes.Add("class") + AllowedClasses.Add("kh-callout") |
Marca los avisos para que el nivel 2 les respete el color. Al sembrar AllowedClasses el filtro queda activo, así que de fábrica solo sobrevive kh-callout y el resto de clases se borra (incluidas las MsoNormal de Word). |
Conservar tus propias clases CSS
Si maquetas con clases tuyas dentro de la documentación, decláralas o el guardado se las lleva:
public static class MiSaneador
{
public static KnowledgeHubSanitizerOptions Options { get; } = new()
{
AllowedClasses = { "mi-indice" }, // por nombre
AllowedClassPrefixes = { "mi-tarjeta-" }, // una familia entera, presente y futura
ConfigureStandard = s => s.AllowCssCustomProperties = true
};
}
// en TODOS los contenedores que limpien (en WASM: cliente y servidor)
services.AddKnowledgeHubHtmlSanitizer(MiSaneador.Options);
- Prefiere los prefijos cuando la familia crezca con el diseño: una clase que nadie se acordó de registrar es indistinguible de basura pegada, y se pierde al guardar.
- Declarar clases no reabre la puerta a Word: la lista es de inclusión, así que
MsoNormalse sigue borrando por no estar en ella. - Llegan a los niveles 1 y 2. El nivel 2 salva la clase pero no la cosmética en línea
(colores, fuentes): tu aspecto debe venir de tu CSS. El nivel 3 quita todas las clases a
propósito —es «solo texto»—; si lo necesitas distinto, usa
ConfigureLevel.
Ampliar las reglas
services.AddKnowledgeHubHtmlSanitizer(o =>
{
o.AllowedTags.Add("iframe"); // por ejemplo, para incrustar vídeo
o.AllowedCssProperties.Add("filter");
});
Parte de KnowledgeHubSanitizerDefaults.CreateSanitizer(), así que los ajustes de arriba ya están
puestos.
Ojo: esta sobrecarga solo configura el nivel 1 (el que usa guardar). Los niveles 2 y 3 se
derivan de los defaults, para que ampliar uno no amplíe todos. Para llegar a los tres, usa
KnowledgeHubSanitizerOptions como en el apartado anterior.
Sustituirlo por completo
Implementa IKnowledgeHubHtmlSanitizer (en MgSoftDev.KnowledgeHub.Abstractions) y regístralo
antes de llamar a AddKnowledgeHubHtmlSanitizer — o en lugar de llamarlo. El método usa
TryAddSingleton, así que la implementación del anfitrión gana.
El contexto (Paste, Save, Manual) permite ser más estricto al pegar que al guardar.
Nota sobre la versión
Se usa HtmlSanitizer 9.2.x, que depende de AngleSharp ≥ 1.7.2. No bajes de la línea 9.1: la
9.0 fija AngleSharp 0.17.1, afectado por CVE-2026-54570, un fallo de parseo que permite
evadir sanitizadores, justo lo que este paquete debe impedir.
Documentación completa: GUIA-IMPLEMENTACION.md
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AngleSharp (>= 1.7.2)
- HtmlSanitizer (>= 9.2.1039)
- MgSoftDev.KnowledgeHub.Abstractions (>= 1.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 34 | 9/13/2026 |
| 0.23.0-preview.1 | 35 | 9/13/2026 |
| 0.22.0-preview.1 | 56 | 9/1/2026 |
| 0.21.0-preview.1 | 80 | 9/1/2026 |
| 0.20.0-preview.1 | 64 | 8/27/2026 |
| 0.19.4-preview.1 | 67 | 8/25/2026 |
| 0.19.3-preview.1 | 63 | 8/15/2026 |
| 0.19.2-preview.1 | 76 | 8/15/2026 |
| 0.19.1-preview.1 | 59 | 8/15/2026 |
| 0.19.0-preview.1 | 64 | 8/15/2026 |
| 0.18.0-preview.1 | 70 | 8/14/2026 |
| 0.17.0-preview.1 | 60 | 8/14/2026 |
| 0.16.0-preview.1 | 67 | 8/13/2026 |
| 0.15.0-preview.1 | 65 | 8/13/2026 |
| 0.14.0-preview.1 | 69 | 8/13/2026 |
| 0.13.0-preview.1 | 67 | 8/13/2026 |
| 0.12.0-preview.1 | 71 | 8/12/2026 |
| 0.11.0-preview.1 | 72 | 8/11/2026 |
| 0.10.0-preview.1 | 63 | 8/11/2026 |
| 0.9.1-preview.1 | 69 | 8/11/2026 |