JavaScriptでHTMLエンティティのエスケープを解除しますか?


176

XML-RPCバックエンドと通信するJavascriptコードがあります。XML-RPCは次の形式の文字列を返します。

<img src='myimage.jpg'>

ただし、JavaScriptを使用してHTMLに文字列を挿入すると、文字どおりにレンダリングされます。画像は表示されません。文字列は文字通り表示されます。

<img src='myimage.jpg'>

私の推測では、HTMLはXML-RPCチャネルを介してエスケープされています。

Javascriptで文字列のエスケープを解除するにはどうすればよいですか?私はこのページのテクニックを試しましたが失敗しました:http : //paulschreiber.com/blog/2008/09/20/javascript-how-to-unescape-html-entities/

問題を診断する他の方法は何ですか?


1
このお試しください:stackoverflow.com/questions/4480757/...を
XP1

回答:


176

編集:Wladimirが示唆するようにDOMParser APIを使用する必要があります。投稿された関数がセキュリティの脆弱性をもたらしたため、以前の回答を編集しました。

次のスニペットは古い回答のコードに小さな変更を加えたものです:のtextarea代わりにを使用divするとXSSの脆弱性が軽減されますが、IE9とFirefoxではまだ問題があります。

function htmlDecode(input){
  var e = document.createElement('textarea');
  e.innerHTML = input;
  // handle case of empty input
  return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}

htmlDecode("&lt;img src='myimage.jpg'&gt;"); 
// returns "<img src='myimage.jpg'>"

基本的に、プログラムでDOM要素を作成し、エンコードされたHTMLをinnerHTMLに割り当て、innerHTML挿入で作成されたテキストノードからnodeValueを取得します。要素を作成するだけで追加することはないため、サイトのHTMLは変更されません。

クロスブラウザー(古いブラウザーを含む)で動作し、すべてのHTML文字エンティティを受け入れます。

編集:このコードの古いバージョンは、ここでjsFiddle(IEのビュー)で証明されているように、空白の入力があるIEでは機能しませんでした。上記のバージョンはすべての入力で機能します。

更新:これは大きな文字列では機能しないようです。また、セキュリティの脆弱性が発生します。コメントを参照してください。


了解しました。 'に変更したので、コメントを削除してみましょう。thx、すばらしい機能です。+ 1
YOU

1
@ S.Mark:&apos;HTML 4エンティティに属していません。そのためです!w3.org/TR/html4/sgml/entities.htmlの fishbowl.pastiche.org/2003/07/01/the_curse_of_apos
CMS

2
このアプローチの不十分なセキュリティに関する@kenderのメモも参照してください。
Joseph Turian、

2
彼が行った不十分なテストについての@kenderへの私のメモを参照してください;)
Roatin Marth

24
この関数はセキュリティ上の問題であり、要素がDOMに追加されていなくてもJavaScriptコードは実行されます。したがって、これは入力文字列が信頼できる場合にのみ使用するものです。私は問題を説明し、安全なソリューションを提供する自分の答えを追加しました。副作用として、複数のテキストノードが存在する場合、結果は途切れません。
Wladimir Palant 2015

375

ここで示すほとんどの回答には大きな欠点があります。変換しようとしている文字列が信頼されていない場合、クロスサイトスクリプティング(XSS)の脆弱性が発生します承認された回答の機能については、次の点を考慮してください。

htmlDecode("<img src='dummy' onerror='alert(/xss/)'>");

ここの文字列にはエスケープされていないHTMLタグが含まれているため、htmlDecode関数は何もデコードする代わりに、文字列内で指定されたJavaScriptコードを実際に実行します。

これは、すべての最新のブラウザーでサポートされているDOMParserを使用することで回避できます

function htmlDecode(input) {
  var doc = new DOMParser().parseFromString(input, "text/html");
  return doc.documentElement.textContent;
}

console.log(  htmlDecode("&lt;img src='myimage.jpg'&gt;")  )    
// "<img src='myimage.jpg'>"

console.log(  htmlDecode("<img src='dummy' onerror='alert(/xss/)'>")  )  
// ""

この関数は、副作用としてJavaScriptコードを実行しないことが保証されています。HTMLタグは無視され、テキストコンテンツのみが返されます。

互換性に関する注意:HTMLを解析するにDOMParserは、少なくともChrome 30、Firefox 12、Opera 17、Internet Explorer 10、Safari 7.1、またはMicrosoft Edgeが必要です。したがって、サポートされていないすべてのブラウザーはEOLをはるかに超えており、2017年の時点でまだ一般に見られるのは、古いInternet ExplorerとSafariのバージョンのみです(通常、これらのバージョンは、問題を起こすほど多くはありません)。


19
XSSの脆弱性について言及しているので、この回答が最良だと思います。
КонстантинВан

2
(参考資料によると)Firefox 12.0以前DOMParserはサポートされていませんでしたまた、をサポートしていない最新バージョンのブラウザがまだいくつかあります。あなたの参照によると、はまだ実験的な技術であり、スタンドインは、私のアプローチに応じて指摘したようにこのXSS脆弱性(ブラウザベンダーによって修正されるはずです)を持つプロパティを使用します。"text/html"DOMParser.prototype.parseFromString()DOMParserinnerHTML
PointedEars 2016

4
@PointedEars:2016年のFirefox 12について誰が気にかけていますか?問題のあるものは、Internet Explorer 9.0までとSafari 7.0です。それらをサポートしない余裕があれば(うまくいけばすぐにみんなになるでしょう)、DOMParserが最良の選択です。そうでない場合-はい、エンティティの処理のみがオプションになります。
Wladimir Palant 2016

4
@PointedEars:<script>実行されていないタグはセキュリティメカニズムではありません。このルールは、設定innerHTMLが同期スクリプトを副作用として実行する可能性がある場合に、トリッキーなタイミングの問題を回避します。HTMLコードのサニタイズはトリッキーな問題であり、innerHTML試みさえしません。Webページが実際にインラインイベントハンドラーを設定しようとしている可能性があるためです。これは、安全ではないデータを完全に停止するためのメカニズムではありません。
Wladimir Palant

1
@ИльяЗеленько:このコードをタイトなループで使用する予定ですか、それともパフォーマンスが重要なのですか?あなたの答えは再びXSSに対して脆弱です、本当にそれだけの価値がありましたか?
ウラジミールパラン

37

jQueryを使用している場合:

function htmlDecode(value){ 
  return $('<div/>').html(value).text(); 
}

それ以外の場合は、優れた機能を持つStrictly SoftwareのEncoder Objectを使用してくださいhtmlDecode()


59
(NOT繰り返す)ユーザー生成によって生成されたコンテンツ以外のコンテンツのためにこれを使用しないでくださいこのユーザー。値に<script>タグがある場合、スクリプトの内容が実行されます!
Malvolio

そのライセンスがサイトのどこにも見つかりません。ライセンスが何であるか知っていますか?
TRiG 2011年

ソースヘッダーにライセンスがあります。GPLです。
Chris Fulstow、2011

6
はい、その関数はXSSへの道を開きます:htmlDecode( "<script> alert(12)</ script> 123&gt;")を試してください
Dinis Cruz

$( '<div />')の意味は何ですか?
エコーヤン

13

トリックは、ブラウザーの機能を使用して特殊なHTML文字をデコードすることですが、ブラウザーが実際のHTMLであるかのように結果を実行することはできません...この関数は、正規表現を使用して、エンコードされたHTML文字を識別し、置き換えます一度に。

function unescapeHtml(html) {
    var el = document.createElement('div');
    return html.replace(/\&[#0-9a-z]+;/gi, function (enc) {
        el.innerHTML = enc;
        return el.innerText
    });
}

正規表現は/\&#?[0-9a-z]+;/gi、#を2番目の文字としてのみ表示する必要があるため、少し厳密に一致させることができます。
TheAtomicOption

これが最良の答えです。XSSの脆弱性を回避し、HTMLタグを取り除きません。
Emmanuel

6

エスケープを解除したいHTMLが非常に長く、65536文字より長い場合を除き、CMSの回答は適切に機能します。そのため、Chromeでは、内部HTMLは多くても65536の長さの多くの子ノードに分割され、それらを連結する必要があります。この関数は、非常に長い文字列に対しても機能します。

function unencodeHtmlContent(escapedHtml) {
  var elem = document.createElement('div');
  elem.innerHTML = escapedHtml;
  var result = '';
  // Chrome splits innerHTML into many child nodes, each one at most 65536.
  // Whereas FF creates just one single huge child node.
  for (var i = 0; i < elem.childNodes.length; ++i) {
    result = result + elem.childNodes[i].nodeValue;
  }
  return result;
}

詳細については、innerHTML最大長に関するこの回答を参照してください:https : //stackoverflow.com/a/27545633/694469


3

あなたの質問への直接の回答ではありませんが、RPCがその構造内にそれらの画像データ(例ではURL)を含む何らかの構造(XMLまたはJSONなど)を返す方が良いのではないでしょうか?

次に、JavaScriptで解析して、 <img> JavaScript自体を使用して。

RPCから受け取る構造は次のようになります。

{"img" : ["myimage.jpg", "myimage2.jpg"]}

この方法の方が良いと思います。外部ソースからのコードをページに挿入するのは安全ではないように見えるからです。XML-RPCスクリプトをハイジャックし、そこに不要なものを置く画像(javascriptも...)


上記の@CMSアプローチにこのセキュリティ上の欠陥はありますか?
ジョセフトゥリアン

htmlDecode関数に渡された次の引数を確認しました:htmlDecode( "&lt; img src = 'myimage.jpg'&gt;&lt; script&gt; document.write( 'xxxxx');&lt; / script&gt;")。 <script> </ script>要素は、悪くなる可能性があります。そして、挿入されるテキストの代わりに構造を返す方が良いと私はまだ思います。たとえば、エラーをうまく処理できます。
ケンダー

1
試してみたがhtmlDecode("&lt;img src='myimage.jpg'&gt;&lt;script&gt;alert('xxxxx');&lt;/script&gt;")何も起こらなかった。デコードされたhtml文字列を期待どおりに戻しました。
Roatin Marth

2

クリスの答えは素晴らしくエレガントですが、値が未定義の場合は失敗します。単純な改善だけで確実になります:

function htmlDecode(value) {
   return (typeof value === 'undefined') ? '' : $('<div/>').html(value).text();
}

改善しなければ、その後の操作を行いますreturn (typeof value !== 'string') ? '' : $('<div/>').html(value).text();
SynCap

2

どういたしまして...ただのメッセンジャーです...完全なクレジットはourcodeworld.comに送られます。

window.htmlentities = {
        /**
         * Converts a string to its html characters completely.
         *
         * @param {String} str String with unescaped HTML characters
         **/
        encode : function(str) {
            var buf = [];

            for (var i=str.length-1;i>=0;i--) {
                buf.unshift(['&#', str[i].charCodeAt(), ';'].join(''));
            }

            return buf.join('');
        },
        /**
         * Converts an html characterSet into its original character.
         *
         * @param {String} str htmlSet entities
         **/
        decode : function(str) {
            return str.replace(/&#(\d+);/g, function(match, dec) {
                return String.fromCharCode(dec);
            });
        }
    };

完全なクレジット:https : //ourcodeworld.com/articles/read/188/encode-and-decode-html-entities-using-pure-javascript


2

これは、これまでに試した中で最も包括的なソリューションです。

const STANDARD_HTML_ENTITIES = {
    nbsp: String.fromCharCode(160),
    amp: "&",
    quot: '"',
    lt: "<",
    gt: ">"
};

const replaceHtmlEntities = plainTextString => {
    return plainTextString
        .replace(/&#(\d+);/g, (match, dec) => String.fromCharCode(dec))
        .replace(
            /&(nbsp|amp|quot|lt|gt);/g,
            (a, b) => STANDARD_HTML_ENTITIES[b]
        );
};

「最も包括的な」?実際に包括的なテストスイートに対してそれを実行してみましたか?
Dan Dascalescu

1

私は十分に夢中になって、この関数を完全ではないにしても、かなり網羅する必要があります:

function removeEncoding(string) {
    return string.replace(/&Agrave;/g, "À").replace(/&Aacute;/g, "Á").replace(/&Acirc;/g, "Â").replace(/&Atilde;/g, "Ã").replace(/&Auml;/g, "Ä").replace(/&Aring;/g, "Å").replace(/&agrave;/g, "à").replace(/&acirc;/g, "â").replace(/&atilde;/g, "ã").replace(/&auml;/g, "ä").replace(/&aring;/g, "å").replace(/&AElig;/g, "Æ").replace(/&aelig;/g, "æ").replace(/&szlig;/g, "ß").replace(/&Ccedil;/g, "Ç").replace(/&ccedil;/g, "ç").replace(/&Egrave;/g, "È").replace(/&Eacute;/g, "É").replace(/&Ecirc;/g, "Ê").replace(/&Euml;/g, "Ë").replace(/&egrave;/g, "è").replace(/&eacute;/g, "é").replace(/&ecirc;/g, "ê").replace(/&euml;/g, "ë").replace(/&#131;/g, "ƒ").replace(/&Igrave;/g, "Ì").replace(/&Iacute;/g, "Í").replace(/&Icirc;/g, "Î").replace(/&Iuml;/g, "Ï").replace(/&igrave;/g, "ì").replace(/&iacute;/g, "í").replace(/&icirc;/g, "î").replace(/&iuml;/g, "ï").replace(/&Ntilde;/g, "Ñ").replace(/&ntilde;/g, "ñ").replace(/&Ograve;/g, "Ò").replace(/&Oacute;/g, "Ó").replace(/&Ocirc;/g, "Ô").replace(/&Otilde;/g, "Õ").replace(/&Ouml;/g, "Ö").replace(/&ograve;/g, "ò").replace(/&oacute;/g, "ó").replace(/&ocirc;/g, "ô").replace(/&otilde;/g, "õ").replace(/&ouml;/g, "ö").replace(/&Oslash;/g, "Ø").replace(/&oslash;/g, "ø").replace(/&#140;/g, "Œ").replace(/&#156;/g, "œ").replace(/&#138;/g, "Š").replace(/&#154;/g, "š").replace(/&Ugrave;/g, "Ù").replace(/&Uacute;/g, "Ú").replace(/&Ucirc;/g, "Û").replace(/&Uuml;/g, "Ü").replace(/&ugrave;/g, "ù").replace(/&uacute;/g, "ú").replace(/&ucirc;/g, "û").replace(/&uuml;/g, "ü").replace(/&#181;/g, "µ").replace(/&#215;/g, "×").replace(/&Yacute;/g, "Ý").replace(/&#159;/g, "Ÿ").replace(/&yacute;/g, "ý").replace(/&yuml;/g, "ÿ").replace(/&#176;/g, "°").replace(/&#134;/g, "†").replace(/&#135;/g, "‡").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&#177;/g, "±").replace(/&#171;/g, "«").replace(/&#187;/g, "»").replace(/&#191;/g, "¿").replace(/&#161;/g, "¡").replace(/&#183;/g, "·").replace(/&#149;/g, "•").replace(/&#153;/g, "™").replace(/&copy;/g, "©").replace(/&reg;/g, "®").replace(/&#167;/g, "§").replace(/&#182;/g, "¶").replace(/&Alpha;/g, "Α").replace(/&Beta;/g, "Β").replace(/&Gamma;/g, "Γ").replace(/&Delta;/g, "Δ").replace(/&Epsilon;/g, "Ε").replace(/&Zeta;/g, "Ζ").replace(/&Eta;/g, "Η").replace(/&Theta;/g, "Θ").replace(/&Iota;/g, "Ι").replace(/&Kappa;/g, "Κ").replace(/&Lambda;/g, "Λ").replace(/&Mu;/g, "Μ").replace(/&Nu;/g, "Ν").replace(/&Xi;/g, "Ξ").replace(/&Omicron;/g, "Ο").replace(/&Pi;/g, "Π").replace(/&Rho;/g, "Ρ").replace(/&Sigma;/g, "Σ").replace(/&Tau;/g, "Τ").replace(/&Upsilon;/g, "Υ").replace(/&Phi;/g, "Φ").replace(/&Chi;/g, "Χ").replace(/&Psi;/g, "Ψ").replace(/&Omega;/g, "Ω").replace(/&alpha;/g, "α").replace(/&beta;/g, "β").replace(/&gamma;/g, "γ").replace(/&delta;/g, "δ").replace(/&epsilon;/g, "ε").replace(/&zeta;/g, "ζ").replace(/&eta;/g, "η").replace(/&theta;/g, "θ").replace(/&iota;/g, "ι").replace(/&kappa;/g, "κ").replace(/&lambda;/g, "λ").replace(/&mu;/g, "μ").replace(/&nu;/g, "ν").replace(/&xi;/g, "ξ").replace(/&omicron;/g, "ο").replace(/&piρ;/g, "ρ").replace(/&rho;/g, "ς").replace(/&sigmaf;/g, "ς").replace(/&sigma;/g, "σ").replace(/&tau;/g, "τ").replace(/&phi;/g, "φ").replace(/&chi;/g, "χ").replace(/&psi;/g, "ψ").replace(/&omega;/g, "ω").replace(/&bull;/g, "•").replace(/&hellip;/g, "…").replace(/&prime;/g, "′").replace(/&Prime;/g, "″").replace(/&oline;/g, "‾").replace(/&frasl;/g, "⁄").replace(/&weierp;/g, "℘").replace(/&image;/g, "ℑ").replace(/&real;/g, "ℜ").replace(/&trade;/g, "™").replace(/&alefsym;/g, "ℵ").replace(/&larr;/g, "←").replace(/&uarr;/g, "↑").replace(/&rarr;/g, "→").replace(/&darr;/g, "↓").replace(/&barr;/g, "↔").replace(/&crarr;/g, "↵").replace(/&lArr;/g, "⇐").replace(/&uArr;/g, "⇑").replace(/&rArr;/g, "⇒").replace(/&dArr;/g, "⇓").replace(/&hArr;/g, "⇔").replace(/&forall;/g, "∀").replace(/&part;/g, "∂").replace(/&exist;/g, "∃").replace(/&empty;/g, "∅").replace(/&nabla;/g, "∇").replace(/&isin;/g, "∈").replace(/&notin;/g, "∉").replace(/&ni;/g, "∋").replace(/&prod;/g, "∏").replace(/&sum;/g, "∑").replace(/&minus;/g, "−").replace(/&lowast;/g, "∗").replace(/&radic;/g, "√").replace(/&prop;/g, "∝").replace(/&infin;/g, "∞").replace(/&OEig;/g, "Œ").replace(/&oelig;/g, "œ").replace(/&Yuml;/g, "Ÿ").replace(/&spades;/g, "♠").replace(/&clubs;/g, "♣").replace(/&hearts;/g, "♥").replace(/&diams;/g, "♦").replace(/&thetasym;/g, "ϑ").replace(/&upsih;/g, "ϒ").replace(/&piv;/g, "ϖ").replace(/&Scaron;/g, "Š").replace(/&scaron;/g, "š").replace(/&ang;/g, "∠").replace(/&and;/g, "∧").replace(/&or;/g, "∨").replace(/&cap;/g, "∩").replace(/&cup;/g, "∪").replace(/&int;/g, "∫").replace(/&there4;/g, "∴").replace(/&sim;/g, "∼").replace(/&cong;/g, "≅").replace(/&asymp;/g, "≈").replace(/&ne;/g, "≠").replace(/&equiv;/g, "≡").replace(/&le;/g, "≤").replace(/&ge;/g, "≥").replace(/&sub;/g, "⊂").replace(/&sup;/g, "⊃").replace(/&nsub;/g, "⊄").replace(/&sube;/g, "⊆").replace(/&supe;/g, "⊇").replace(/&oplus;/g, "⊕").replace(/&otimes;/g, "⊗").replace(/&perp;/g, "⊥").replace(/&sdot;/g, "⋅").replace(/&lcell;/g, "⌈").replace(/&rcell;/g, "⌉").replace(/&lfloor;/g, "⌊").replace(/&rfloor;/g, "⌋").replace(/&lang;/g, "⟨").replace(/&rang;/g, "⟩").replace(/&loz;/g, "◊").replace(/&#039;/g, "'").replace(/&amp;/g, "&").replace(/&quot;/g, "\"");
}

そのように使用:

let decodedText = removeEncoding("Ich hei&szlig;e David");
console.log(decodedText);

プリント: Ich Heiße David

PSこれを作るのに1時間半ほどかかりました。


0

JavaScriptでHTMLエンティティ*のエスケープを解除するには、小さなライブラリhtml-escaperを使用できます。npm install html-escaper

import {unescape} from 'html-escaper';

unescape('escaped string');

または、使用している場合は、LodashまたはUnderscoreのunescape関数。


*)してください、これらの機能は、すべてのHTMLエンティティをカバーしていないことに注意してくださいが、唯一の最も一般的なもの、すなわち&<>'"。すべてのHTMLエンティティのエスケープを解除するには、ライブラリを使用できます。


-1

私はこれを自分のプロジェクトで使用します。他の回答に触発されましたが、追加の安全なパラメーターがあり、装飾されたキャラクターを扱うときに役立ちます

var decodeEntities=(function(){

    var el=document.createElement('div');
    return function(str, safeEscape){

        if(str && typeof str === 'string'){

            str=str.replace(/\</g, '&lt;');

            el.innerHTML=str;
            if(el.innerText){

                str=el.innerText;
                el.innerText='';
            }
            else if(el.textContent){

                str=el.textContent;
                el.textContent='';
            }

            if(safeEscape)
                str=str.replace(/\</g, '&lt;');
        }
        return str;
    }
})();

そしてそれは次のように使用できます:

var label='safe <b> character &eacute;ntity</b>';
var safehtml='<div title="'+decodeEntities(label)+'">'+decodeEntities(label, true)+'</div>';

-1

ここでの他のすべての回答には問題があります。

document.createElement( 'div')メソッド(jQueryを使用するものを含む)は、それに渡されるjavascriptを実行し(セキュリティの問題)、DOMParser.parseFromString()メソッドは空白を削除します。以下は、どちらの問題もない純粋なJavaScriptソリューションです。

function htmlDecode(html) {
    var textarea = document.createElement("textarea");
    html= html.replace(/\r/g, String.fromCharCode(0xe000)); // Replace "\r" with reserved unicode character.
    textarea.innerHTML = html;
    var result = textarea.value;
    return result.replace(new RegExp(String.fromCharCode(0xe000), 'g'), '\r');
}

TextAreaは、特にjsコードの実行を回避するために使用されます。それはこれらを渡します:

htmlDecode('&lt;&amp;&nbsp;&gt;'); // returns "<& >" with non-breaking space.
htmlDecode('  '); // returns "  "
htmlDecode('<img src="dummy" onerror="alert(\'xss\')">'); // Does not execute alert()
htmlDecode('\r\n') // returns "\r\n", doesn't lose the \r like other solutions.

1
いいえ、別のタグを使用しても問題解決しませ。これはまだXSSの脆弱性htmlDecode("</textarea><img src=x onerror=alert(1)>")です。Sergio Belevskijの回答ですでにこの問題を指摘した後、あなたはこれを投稿しました。
ウラジミールパラント

あなたが説明している問題を再現できません。私はあなたのコードをこのJsFiddleに入れており、実行時にアラートは表示されません。 jsfiddle.net/edsjt15g/1見て いただけますか?どのブラウザを使用していますか?
EricP '19

2
Firefoxを使用しています。実際、Chromeはこのシナリオを異なる方法で処理するため、コードは実行されません。ただし、信頼すべきものではありません。
ウラジミールパラント

-1
var encodedStr = 'hello &amp; world';

var parser = new DOMParser;
var dom = parser.parseFromString(
    '<!doctype html><body>' + encodedStr,
    'text/html');
var decodedString = dom.body.textContent;

console.log(decodedString);

@Wladimir Palant(AdBlock Plusの作者)は、4年前にDOMParserの回答を既に提供しています。投稿する前に以前の回答を読んだことがありますか?
Dan Dascalescu

-7

最上部には、回答と比べて80%生産性が高いバリアントがあります。

ベンチマークを参照してください:https : //jsperf.com/decode-html12345678/1

性能試験

console.log(decodeEntities('test: &gt'));

function decodeEntities(str) {
  // this prevents any overhead from creating the object each time
  const el = decodeEntities.element || document.createElement('textarea')

  // strip script/html tags
  el.innerHTML = str
    .replace(/<script[^>]*>([\S\s]*?)<\/script>/gmi, '')
    .replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/gmi, '');

  return el.value;
}

タグを残す必要がある場合は、2つの.replace(...)呼び出しを削除します(スクリプトが必要ない場合は、最初の呼び出しを残すことができます)。


6
おめでとうございます。偽の消毒ロジックで脆弱性を覆い隠すことができました。実際には重要ではないパフォーマンスの向上のためです。decodeEntities("</textarea '><img src=x onerror=alert(1) \">")Firefoxで呼び出してみてください。正規表現によるHTMLコードのサニタイズの試行を停止してください。
ウラジミールパラント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.