Torna agli aggiornamenti
New releaseSep 22, 2026

java-html-sanitizer v20260921.1

Accetta HTML di terze parti e produce HTML sicuro da incorporare nella tua applicazione web. Veloce e facile da configurare.

Condividi

OWASP Java HTML Sanitizer

Java CI with Maven Coverage Status CII Best Practices Maven Central

Un sanificatore HTML veloce e facile da configurare scritto in Java che ti consente di includere HTML creato da terze parti nella tua applicazione web proteggendoti da XSS.

La dipendenza esistente è su JSR 305. Gli altri jar servono solo per la suite di test. La dipendenza da JSR 305 è una dipendenza solo di compilazione, necessaria unicamente per le annotazioni.

Questo codice è stato scritto tenendo a mente le migliori pratiche di sicurezza, ha una suite di test estesa ed è stato sottoposto a revisione della sicurezza avversaria.

Indice

Per iniziare

Per iniziare include istruzioni su come iniziare con o senza Maven.

Policy preconfigurate

Puoi usare policy preconfigurate:

PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
String safeHTML = policy.sanitize(untrustedHTML);

Creare una policy

I test mostrano come configurare la tua policy:

PolicyFactory policy = new HtmlPolicyBuilder()
    .allowElements("a")
    .allowUrlProtocols("https")
    .allowAttributes("href").onElements("a")
    .requireRelNofollowOnLinks()
    .toFactory();
String safeHTML = policy.sanitize(untrustedHTML);

Policy personalizzate

Puoi scrivere policy personalizzate per fare cose come trasformare gli h1 in div con una certa classe:

PolicyFactory policy = new HtmlPolicyBuilder()
    .allowElements("p")
    .allowElements(
        (String elementName, List<String> attrs) -> {
          // Add a class attribute.
          attrs.add("class");
          attrs.add("header-" + elementName);
          // Return elementName to include, null to drop.
          return "div";
        }, "h1", "h2", "h3", "h4", "h5", "h6")
    .toFactory();
String safeHTML = policy.sanitize(untrustedHTML);

Si prega di notare che gli elementi "a", "font", "img", "input" e "span" devono essere esplicitamente inseriti nella whitelist usando il metodo allowWithoutAttributes() se si desidera che vengano lasciati passare dal filtro quando questi elementi non includono alcun attributo.

Le policy sugli attributi consentono anche di eseguire codice personalizzato. Aggiungere una policy sugli attributi non indebolirà alcuna policy predefinita come style o i controlli sugli attributi URL.

new HtmlPolicyBuilder = new HtmlPolicyBuilder()
    .allowElement("div", "span")
    .allowAttributes("data-foo")
        .matching(
            (String elementName, String attributeName, String value) -> {
              // Return value for the attribute or null to drop.
            })
        .onElements("div", "span")
    .build()

Preprocessori

I preprocessori consentono di inserire testo e modifiche strutturali su larga scala.

new HtmlPolicyBuilder = new HtmlPolicyBuilder()
    // Use a preprocessor to be backwards compatible with the
    // <plaintext> element which 
    .withPreprocessor(
        (HtmlStreamEventReceiver r) -> {
          // Provide user with info about links before they click.
          // Before:                       <a href="https://example.com/...">
          // After:  (https://example.com) <a href="https://example.com/...">
          return new HtmlStreamEventReceiverWrapper(r) {
            @Override public void openTag(String elementName, List<String> attrs) {
              if ("a".equals(elementName)) {
                for (int i = 0, n = attrs.size(); i < n; i += 2) {
                  if ("href".equals(attrs.get(i)) {
                    String url = attrs.get(i + 1);
                    String origin;
                    try {
                      URI uri = new URI(url);
                      String scheme = uri.getScheme();
                      String authority = uri.getRawAuthority();
                      if (scheme == null && authority == null) {
                        origin = null;
                      } else {
                        origin = (scheme != null ? scheme + ":" : "")
                               + (authority != null ? "//" + authority : "");
                      }
                    } catch (URISyntaxException ex) {
                      origin = "about:invalid";
                    }
                    if (origin != null) {
                      text(" (" + origin + ") ");
                    }
                  }
                }
              }
              super.openTag(elementName, attrs);
            }
          };
        }
    .allowElement("a")
    ...
    .build()

La pre-elaborazione avviene prima dell'applicazione di una policy, quindi non può influire sulla sicurezza dell'output.

Telemetria

Quando una policy rifiuta un elemento o un attributo, notifica un HtmlChangeListener.

Puoi usarlo per tenere traccia delle tendenze delle violazioni delle policy e scoprire quando qualcuno sta tentando di violare la tua sicurezza.

PolicyFactory myPolicyFactory = ...;
// If you need to associate reports with some context, you can do so.
MyContextClass myContext = ...;

String sanitizedHtml = myPolicyFactory.sanitize(
    unsanitizedHtml,
    new HtmlChangeListener<MyContextClass>() {
      @Override
      public void discardedTag(MyContextClass context, String elementName) {
        // ...
      }
      @Override
      public void discardedAttributes(
          MyContextClass context, String elementName, String... attributeNames) {
        // ...
      }
    },
    myContext);

Nota: Se una stringa viene sanificata senza notifiche di modifica, non è detto che la stringa in ingresso sia necessariamente sicura da usare. Usa solo l'output del sanificatore.

Il sanificatore garantisce che l'output sia in un sottoinsieme di HTML sul cui significato i parser HTML comunemente usati saranno d'accordo, ma l'assenza di notifiche non significa che l'input sia in tale sottoinsieme, solo che non contiene elementi o attributi che sono stati rimossi.

Vedi "Perché sanificare quando si può validare" per maggiori informazioni su questo argomento.

Domande?

Se desideri segnalare una vulnerabilità, consulta AttackReviewGroundRules.

Iscriviti alla mailing list per essere notificato su Vulnerabilità note e aggiornamenti importanti.

Contribuire

Se desideri contribuire, contatta @mvsamuel o @manicode.

Accogliamo con favore segnalazioni di problemi e PR. Le PR che modificano il comportamento o aggiungono funzionalità dovrebbero includere sia test positivi che test negativi.

Tieni presente che i contributi sono soggetti alla Licenza Apache 2.0.

Crediti

Grazie a tutti coloro che hanno aiutato con critiche e codice

Categorie