জাভাতে এইচটিএমএল এড়িয়ে চলার জন্য প্রস্তাবিত পদ্ধতি


262

সেখানে পালিয়ে যেতে একটি প্রস্তাবিত উপায় আছে কি <, >, "এবং &প্লেইন জাভা কোড অক্ষর যখন আউটপুট এইচটিএমএল? (ম্যানুয়ালি নিম্নলিখিতগুলি করা ব্যতীত অন্যটি)।

String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "&lt;").replace("&", "&amp;"); // ...

2
সচেতন থাকুন যে আপনি যদি কোনও উত্তরহীন এইচটিএমএল বৈশিষ্ট্যে আউটপুট দিচ্ছেন, অন্য অক্ষর যেমন স্থান, ট্যাব, ব্যাকস্পেস ইত্যাদি ... আক্রমণকারীদের তালিকাভুক্ত অক্ষরগুলির কোনও ছাড়াই জাভাস্ক্রিপ্টের বৈশিষ্ট্যগুলি প্রবর্তন করতে দেয়। আরও তথ্যের জন্য OWASP XSS প্রতিরোধ চিট শীট দেখুন at
জেফ উইলিয়ামস

বিটিডাব্লু, এই কোডটিতে, সঠিকভাবে কাজ করার জন্য আপনার "<" এর আগে "&" এড়াতে হবে ("& lt;" "& amp; lt;" এর সাথে প্রতিস্থাপন করুন, অন্যথায়, যা "& lt;" হিসাবে রেন্ডার করা হয়েছে, তবে "<" নয় "):source.replace("&", "&amp;").replace("<", "&lt;");
'23

উত্তর:


261

অ্যাপাচি কমন্স ল্যাং থেকে স্ট্রিংস্পট ইউটেলস :

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
// ...
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = escapeHtml(source);

জন্য সংস্করণ 3 :

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
// ...
String escaped = escapeHtml4(source);

2
StringEscapeUtilsআপনি যদি এইচটিএমএল / এক্সএমএল হোয়াইটস্পেসের সাধারণীকরণ এড়াতে চান তবে এটি দুর্দান্ত হলেও এটি বৈশিষ্ট্যের জন্য সাদা স্থান থেকে সঠিকভাবে এড়াতে পারবেন না। আরও বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
অ্যাডাম জেন্ট

21
উপরের উদাহরণটি ভেঙে গেছে। এখন EscapeHtml4 () পদ্ধতিটি ব্যবহার করুন।
stackoverflowuser2010

3
পেয়ারা ভক্তদের জন্য নীচে Okranz এর উত্তর দেখুন।
জর্জ হকিন্স

2
যদি ওয়েবপৃষ্ঠায় ইউটিএফ -8 এনকোডিং থাকে তবে আমাদের কেবল দরকার পেয়ারার এইচটিএমএল এসক্রিপ্ট যা কেবলমাত্র নিম্নলিখিত পাঁচটি এসসিআইআই অক্ষর থেকে বেরিয়ে যায়: '"& <> Apপ্যাচের এসএইচটিএমএল () অ্যাকসেন্ট সহ অ-এএসসিআইআই অক্ষরগুলিও প্রতিস্থাপন করে যা ইউটিএফ -8 ওয়েবের সাথে অপ্রয়োজনীয় বলে মনে হয় পৃষ্ঠা?
zdenekca

4
এটি এখন কমন্স-ল্যাং 3 এ অবচয় করা হয়েছে। এটি commons.apache.org/proper/commons-text এ
ড্যানি

137

ব্যবহার করুন: অ্যাপাচি কমন্স একটি বিকল্প স্প্রিং এর HtmlUtils.htmlEscape(String input)পদ্ধতি।


9
ধন্যবাদ। আমি এটা (পরিবর্তে ব্যবহার করেছি StringEscapeUtils.escapeHtml()থেকে apache-commons2.6) কারণ এটি হিসাবে রাশিয়ান অক্ষর ছেড়ে।
স্লাভা সেমুশিন

6
এটা জানা ভাল. টিবিএইচ আমি এই দিনগুলিতে অ্যাপাচি স্টাফগুলিকে একটি প্রশস্ত বার্থ দেই।
অ্যাডামস্কি

1
আমি এটি ব্যবহার করেছি, এটিও চীনা অক্ষরকে যেমন রয়েছে তেমন ছেড়ে দেয়।
smartwjw

এটি নীচে উল্লিখিত পেয়ারা বিকল্পের সাথে কীভাবে তুলনা করবে?
বিশ্বস ভাসুক আসুকি

2
এটি অ্যাডোস্টোফিকেও এনকোড করে রাখে, তাই এটি অ্যাপাচি স্ট্রিংএস্কেপ ইউটিস
ডেভিড বালেক

57

দুর্দান্ত সংক্ষিপ্ত পদ্ধতি:

public static String escapeHTML(String s) {
    StringBuilder out = new StringBuilder(Math.max(16, s.length()));
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c > 127 || c == '"' || c == '\'' || c == '<' || c == '>' || c == '&') {
            out.append("&#");
            out.append((int) c);
            out.append(';');
        } else {
            out.append(c);
        }
    }
    return out.toString();
}

Https://stackoverflow.com/a/8838023/1199155 (অ্যাম্প সেখানে অনুপস্থিত) এর উপর ভিত্তি করে । Http://www.w3.org/TR/html4/sgml/entities.html অনুসারে, যদি ক্লজটিতে যাচাই করা চারটি অক্ষর কেবল 128 এর নীচে থাকে


খুশী হলাম। এটি এনকোডিংয়ের "এইচটিএমএল সংস্করণগুলি" ব্যবহার করে না (উদাহরণস্বরূপ: "á" "& # 225;" এর পরিবর্তে "& aacute;" হবে), তবে যেহেতু সংখ্যাসূচকগুলি আই আই 7 তেও কাজ করে আমি অনুমান করি যে আমি করি না চিন্তা করতে হবে. ধন্যবাদ।
nonzaprej

যখন ওপি 4 টি প্রাসঙ্গিক অক্ষর থেকে পালাতে বলেছিল তখন আপনি কেন সমস্ত অক্ষর এনকোড করবেন? আপনি সিপিইউ এবং স্মৃতি নষ্ট করছেন।
ডেভিড বালেক

1
আপনি প্রেরিতকে ভুলে গেছেন। সুতরাং লোকেরা যেখানেই এই কোডটি অ্যাট্রিবিউট মানগুলি থেকে বাঁচতে ব্যবহার করা হয় সেখানে অদৃশ্য বৈশিষ্ট্যগুলি ইনজেক্ট করতে পারে।
ডেভিড বালেক

45

অ্যাপাচি কমন্স ল্যাং লাইব্রেরির একটি নতুন সংস্করণ রয়েছে এবং এটিতে একটি পৃথক প্যাকেজ নাম ব্যবহার করা হয় (org.apache.commons.lang3)। StringEscapeUtilsএখন নথি বিভিন্ন ধরনের পলায়নের জন্য বিভিন্ন স্ট্যাটিক পদ্ধতি আছে ( http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html )। সুতরাং এইচটিএমএল সংস্করণ 4.0 স্ট্রিং এড়াতে:

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;

String output = escapeHtml4("The less than sign (<) and ampersand (&) must be escaped before using them in HTML");

3
দুর্ভাগ্যক্রমে এইচটিএমএল 5 এর জন্য কিছুই বিদ্যমান নেই, বা অ্যাপাচি ডকুমেন্টগুলি এইচটিএমএল 5 এর জন্য এসএইচটিএমএল 4 ব্যবহার করা উপযুক্ত কিনা তা নির্দিষ্ট করে না
পল ভিনসেন্ট ক্র্যাভেন

43

যারা গুগু পেয়ারা ব্যবহার করেন তাদের জন্য:

import com.google.common.html.HtmlEscapers;
[...]
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = HtmlEscapers.htmlEscaper().escape(source);

40

অ্যান্ড্রয়েডে (এপিআই 16 বা ততোধিক) আপনি করতে পারেন:

Html.escapeHtml(textToScape);

বা নিম্ন API এর জন্য:

TextUtils.htmlEncode(textToScape);

escapeHtmlপরিবর্তে ব্যবহার করার কোনও কারণ আছে htmlEncode?
Muz

2
এই দুইয়ের মধ্যে পার্থক্য সম্পর্কে আমার প্রশ্নটিও দেখুন । (@ মুজ)
জোনাসসিজে - মনিকা

37

এই বিষয়ে সতর্কতা অবলম্বন করুন। এইচটিএমএল ডকুমেন্টের মধ্যে বিভিন্ন 'প্রসঙ্গ' রয়েছে: একটি উপাদানটির অভ্যন্তরে, উদ্ধৃত বৈশিষ্ট্য মান, অব্যক্ত বৈশিষ্ট্য মান, ইউআরএল বৈশিষ্ট্য, জাভাস্ক্রিপ্ট, সিএসএস ইত্যাদি ... আপনার প্রতিটি জন্য আলাদা এনকোডিং পদ্ধতি ব্যবহার করতে হবে ক্রস-সাইট স্ক্রিপ্টিং (এক্সএসএস) রোধ করতে এগুলি। পরীক্ষা করে দেখুন OWASP পদ্ধতি এটা XSS প্রতিরোধ চিট শিট এই প্রেক্ষিতে প্রতিটি বিস্তারিত। OWASP ESAPI গ্রন্থাগার - এই https://github.com/ESAPI/esapi-java-legacy - এ এই প্রসঙ্গে প্রতিটি প্রবন্ধের জন্য আপনি পালানোর পদ্ধতিগুলি খুঁজে পেতে পারেন ।


6
আপনাকে উল্লেখ করার জন্য ধন্যবাদ যে আপনি যে প্রসঙ্গে আউটপুটটি এনকোড করতে চান তা খুব গুরুত্বপূর্ণ। "এনকোড" শব্দটি "এস্কেপ" এর চেয়েও অনেক বেশি উপযুক্ত ক্রিয়াপদ। এস্কেপ বলতে কিছু ধরণের বিশেষ হ্যাক বোঝায়, "আমি কীভাবে এই স্ট্রিংটি এনকোড করব: এর বিপরীতে, একটি এক্সএইচএমএল বৈশিষ্ট্য / এসকিউএল কোয়েরি প্যারামিটার / পোস্টস্ক্রিপ্ট প্রিন্ট স্ট্রিং / সিএসভি আউটপুট ক্ষেত্র?
রবপ্রোগ

5
'এনকোড' এবং 'পালানো' উভয়ই এটি বর্ণনা করতে ব্যাপকভাবে ব্যবহৃত হয়। শব্দটি "পলায়ন" সাধারণত ব্যবহৃত হয় যখন প্রক্রিয়াটি সিন্ট্যাক্টিক্যালি-প্রাসঙ্গিক চরিত্রের আগে "পলায়ন চরিত্র" যুক্ত করতে থাকে যেমন ব্যাকস্ল্যাশের সাথে একটি উদ্ধৃতি চরিত্রের পালিয়ে যাওয়া \ "এনকোড" শব্দটি সাধারণত আপনি যখন অনুবাদ করেন তখন ব্যবহৃত হয় চরিত্রটি অন্য কোনও রূপে, যেমন URL টি এনকোডিং হিসাবে কোট অক্ষর% 22 অথবা এইচটিএমএল সত্তা এনকোডিং হিসাবে & # x22 বা @ কোট।
জেফ উইলিয়ামস


1
আপনাকে কিছুটা গুগলিং বাঁচাতে, এনকোডার শ্রেণির স্ট্যাটিক.জ্যাভডোক.আইও
জাকুব বোচেনস্কি

14

কিছু উদ্দেশ্যে, এইচটিএমএল ইউটিস :

import org.springframework.web.util.HtmlUtils;
[...]
HtmlUtils.htmlEscapeDecimal("&"); //gives &#38;
HtmlUtils.htmlEscape("&"); //gives &amp;

1
বসন্ত থেকে এইচটিএমএল ইউটিলেস মন্তব্য করেছে: * <p> স্ট্রিং পলানকারী ইউটিলিটির একটি বিস্তৃত সেটগুলির জন্য, * অ্যাপাচি কমন্স ল্যাং এবং এর স্ট্রিংএস্কেপ ইউটিস শ্রেণি বিবেচনা করুন। * রানটাইম নির্ভরতা এড়াতে আমরা এখানে এই শ্রেণিটি ব্যবহার করছি না * কেবলমাত্র এইচটিএমএল পলায়নের জন্য কমন্স ল্যাং-এ। তদ্ব্যতীত, স্প্রিংয়ের * এইচটিএমএল এস্কেপিং আরও নমনীয় এবং 100% এইচটিএমএল 4.0 এর সাথে সঙ্গতিপূর্ণ। যদি আপনি ইতিমধ্যে আপনার প্রকল্পে অ্যাপাচি কমন্স ব্যবহার করছেন তবে সম্ভবত আপনার অ্যাপাচি
অ্যান্ডেরো

10

যদিও @ ডিএফএর উত্তরটি দুর্দান্ত org.apache.commons.lang.StringEscapeUtils.escapeHtmlএবং আমি অতীতে এটি ব্যবহার করেছি এটি HTML (বা এক্সএমএল) বৈশিষ্ট্যগুলি পালানোর জন্য ব্যবহার করা উচিত নয় অন্যথায় স্বাভাবিক করা হবে (অর্থাত্ সমস্ত সংলগ্ন সাদা জায়গার অক্ষর একক স্থান হয়ে যায়)।

আমি এটি জানি কারণ আমার লাইব্রেরির (জেএটিএল) বিরুদ্ধে এমন বৈশিষ্ট্যের জন্য বাগ দায়ের করেছি যেখানে শ্বেত স্থান সংরক্ষণ করা হয়নি। সুতরাং আমার কাছে (কপি এন 'পেস্ট) শ্রেণিতে একটি ড্রপ রয়েছে ( যার মধ্যে আমি জেডিএম থেকে কিছু চুরি করেছি) যা বৈশিষ্ট্য এবং উপাদান সামগ্রীর অবতরণকে পৃথক করে

যদিও এটি অতীতে অতটা মেটাতে পারে নি (যথাযথ বৈশিষ্ট্য থেকে পালানো) এটি HTML5 এর data-বৈশিষ্ট্য ব্যবহারের ফলে ক্রমবর্ধমান বৃহত্তর হয়ে উঠছে ।


9

org.apache.commons.lang3.StringEcreenUtils এখন হ্রাস করা হয়েছে। আপনাকে এখন org.apache.commons.text.StringEcreenUtils ব্যবহার করতে হবে

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-text</artifactId>
        <version>${commons.text.version}</version>
    </dependency>

1

সর্বাধিক গ্রন্থাগারগুলি শত শত প্রতীক এবং হাজার হাজার নন-এএসসিআইআই অক্ষর সহ তারা যা কিছু পারে তা পালানোর অফার দেয় যা ইউটিএফ -8 বিশ্বে আপনি যা চান তা নয়।

এছাড়াও, জেফ উইলিয়ামস যেমন উল্লেখ করেছেন, কোনও "এস্কেপ এইচটিএমএল" বিকল্প নেই, সেখানে অনেকগুলি প্রসঙ্গ রয়েছে।

ধরে নিই যে আপনি কখনই অব্যক্ত বৈশিষ্ট্য ব্যবহার করবেন না এবং বিভিন্ন প্রসঙ্গে উপস্থিত রয়েছে তা মনে রেখে এটি আমার নিজস্ব সংস্করণ লিখেছিল:

private static final long BODY_ESCAPE =
        1L << '&' | 1L << '<' | 1L << '>';
private static final long DOUBLE_QUOTED_ATTR_ESCAPE =
        1L << '"' | 1L << '&' | 1L << '<' | 1L << '>';
private static final long SINGLE_QUOTED_ATTR_ESCAPE =
        1L << '"' | 1L << '&' | 1L << '\'' | 1L << '<' | 1L << '>';

// 'quot' and 'apos' are 1 char longer than '#34' and '#39' which I've decided to use
private static final String REPLACEMENTS = "&#34;&amp;&#39;&lt;&gt;";
private static final int REPL_SLICES = /*  |0,   5,   10,  15, 19, 23*/
        5<<5 | 10<<10 | 15<<15 | 19<<20 | 23<<25;
// These 5-bit numbers packed into a single int
// are indices within REPLACEMENTS which is a 'flat' String[]

private static void appendEscaped(
        StringBuilder builder,
        CharSequence content,
        long escapes // pass BODY_ESCAPE or *_QUOTED_ATTR_ESCAPE here
) {
    int startIdx = 0, len = content.length();
    for (int i = 0; i < len; i++) {
        char c = content.charAt(i);
        long one;
        if (((c & 63) == c) && ((one = 1L << c) & escapes) != 0) {
        // -^^^^^^^^^^^^^^^   -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        // |                  | take only dangerous characters
        // | java shifts longs by 6 least significant bits,
        // | e. g. << 0b110111111 is same as >> 0b111111.
        // | Filter out bigger characters

            int index = Long.bitCount(SINGLE_QUOTED_ATTR_ESCAPE & (one - 1));
            builder.append(content, startIdx, i /* exclusive */)
                    .append(REPLACEMENTS,
                            REPL_SLICES >>> 5*index & 31,
                            REPL_SLICES >>> 5*(index+1) & 31);
            startIdx = i + 1;
        }
    }
    builder.append(content, startIdx, len);
}

লাইন দৈর্ঘ্যের সীমা ছাড়াই জিস্ট থেকে অনুলিপি-পেস্টিং বিবেচনা করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.