अपडेट पर वापस जाएँ
New releaseSep 22, 2026

java-html-sanitizer v20260921.1

तीसरे पक्ष के HTML को लेता है और ऐसा HTML उत्पन्न करता है जो आपके वेब एप्लिकेशन में एम्बेड करने के लिए सुरक्षित हो। तेज़ और कॉन्फ़िगर करने में आसान।

साझा करें

OWASP Java HTML Sanitizer

Java CI with Maven Coverage Status CII Best Practices Maven Central

यह Java में लिखा गया एक तेज़ और कॉन्फ़िगर करने में आसान HTML सैनिटाइज़र है जो आपको अपने वेब एप्लिकेशन में तृतीय-पक्षों द्वारा लिखे गए HTML को शामिल करने की सुविधा देता है, साथ ही XSS से सुरक्षा प्रदान करता है।

मौजूदा निर्भरता JSR 305 पर है। अन्य jars केवल परीक्षण सुइट के लिए आवश्यक हैं। JSR 305 निर्भरता केवल संकलन-समय की निर्भरता है, जो केवल एनोटेशन के लिए आवश्यक है।

यह कोड सुरक्षा सर्वोत्तम प्रथाओं को ध्यान में रखकर लिखा गया है, इसमें एक व्यापक परीक्षण सुइट है, और यह प्रतिकूल सुरक्षा समीक्षा से गुजर चुका है।

विषय सूची

आरंभ करना

आरंभ करना में Maven के साथ या बिना Maven के आरंभ करने के निर्देश शामिल हैं।

पूर्व-पैकेज्ड नीतियाँ

आप पूर्व-पैकेज्ड नीतियाँ उपयोग कर सकते हैं:

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

नीति तैयार करना

ये परीक्षण दिखाते हैं कि आप अपनी स्वयं की नीति कैसे कॉन्फ़िगर करें:

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

कस्टम नीतियाँ

आप कस्टम नीतियाँ लिख सकते हैं, जैसे कि h1s को किसी विशेष class के साथ divs में बदलने जैसे कार्य करने के लिए:

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);

कृपया ध्यान दें कि तत्व "a", "font", "img", "input" और "span" को allowWithoutAttributes() विधि का उपयोग करके स्पष्ट रूप से श्वेत-सूचीबद्ध करने की आवश्यकता है, यदि आप चाहते हैं कि जब इन तत्वों में कोई विशेषता शामिल न हो तो उन्हें फ़िल्टर के माध्यम से अनुमति दी जाए।

विशेषता नीतियाँ भी कस्टम कोड चलाने की अनुमति देती हैं। किसी विशेषता नीति को जोड़ने से style या 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()

प्रीप्रोसेसर

प्रीप्रोसेसर टेक्स्ट सम्मिलित करने और बड़े पैमाने पर संरचनात्मक परिवर्तनों की अनुमति देते हैं।

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()

प्रीप्रोसेसिंग किसी नीति को लागू करने से पहले होती है, इसलिए यह आउटपुट की सुरक्षा को प्रभावित नहीं कर सकती।

टेलीमेट्री

जब कोई नीति किसी तत्व या विशेषता को अस्वीकार करती है, तो यह HtmlChangeListener को सूचित करती है।

आप इसका उपयोग नीति उल्लंघन की प्रवृत्तियों पर नज़र रखने और यह पता लगाने के लिए कर सकते हैं कि कोई व्यक्ति कब आपकी सुरक्षा भंग करने का प्रयास कर रहा है।

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);

नोट: यदि कोई स्ट्रिंग बिना किसी परिवर्तन सूचना के सैनिटाइज़ होती है, तो इसका मतलब यह नहीं है कि इनपुट स्ट्रिंग आवश्यक रूप से उपयोग करने के लिए सुरक्षित है। केवल सैनिटाइज़र के आउटपुट का उपयोग करें।

सैनिटाइज़र यह सुनिश्चित करता है कि आउटपुट HTML के एक उप-समूह में है जिसके अर्थ पर सामान्यतः उपयोग किए जाने वाले HTML पार्सर सहमत होंगे, लेकिन सूचनाओं की अनुपस्थिति का अर्थ यह नहीं है कि इनपुट ऐसे उप-समूह में है; इसका अर्थ केवल यह है कि इसमें वे तत्व या विशेषताएँ शामिल नहीं हैं जिन्हें हटा दिया गया था।

इस विषय पर अधिक जानकारी के लिए "जब आप मान्य कर सकते हैं तो सैनिटाइज़ क्यों करें" देखें।

प्रश्न?

यदि आप किसी भेद्यता की रिपोर्ट करना चाहते हैं, तो कृपया AttackReviewGroundRules देखें।

ज्ञात भेद्यताओं और महत्वपूर्ण अपडेट्स के बारे में सूचित होने के लिए मेलिंग सूची की सदस्यता लें।

योगदान

यदि आप योगदान देना चाहते हैं, तो कृपया @mvsamuel या @manicode को संपर्क करें।

हम समस्या रिपोर्ट और PRs का स्वागत करते हैं। जो PRs व्यवहार बदलते हैं या कार्यक्षमता जोड़ते हैं, उनमें सकारात्मक और नकारात्मक परीक्षण दोनों शामिल होने चाहिए।

कृपया ध्यान रखें कि योगदान Apache 2.0 लाइसेंस के अंतर्गत आते हैं।

श्रेय

आलोचना और कोड के साथ मदद करने वाले सभी लोगों को धन्यवाद

श्रेणियाँ