jQueryでHTML文字列をエスケープする


609

jQueryで文字列からHTMLをエスケープする簡単な方法を知っている人はいますか?任意の文字列を渡し、HTMLページに表示するために適切にエスケープする必要があります(JavaScript / HTMLインジェクション攻撃を防ぐため)。これを行うためにjQueryを拡張することは可能だと確信していますが、現時点では、これを実現するためのフレームワークについて十分に理解していません。


回答:


445

jQueryを使用しているので、要素のtextプロパティを設定するだけです。

// before:
// <div class="someClass">text</div>
var someHtmlString = "<script>alert('hi!');</script>";

// set a DIV's text:
$("div.someClass").text(someHtmlString);
// after: 
// <div class="someClass">&lt;script&gt;alert('hi!');&lt;/script&gt;</div>

// get the text in a string:
var escaped = $("<div>").text(someHtmlString).html();
// value: 
// &lt;script&gt;alert('hi!');&lt;/script&gt;

57
エスケープされたバージョンを取得するために$( "div.someClass")。html()にアクセスする必要があるという点を逃しました。
Morten Christiansen、

16
文字列に空白と\ n \ r \ t文字が含まれている場合、これはブラウザ間で安全ではありません
nivcaner

20
@travisこれはjQuery Webサイトに記載されています。「ブラウザによってHTMLパーサーが異なるため、返されるテキストは改行やその他の空白で異なる場合があります。」api.jquery.com/text
geofflee

3
すでにこのソリューションを使用している場合@mklementは、次のようなことやって何かをすべての問題を持っていません。$(element2).attr("some-attr", $(element1).html());この例を参照してください:jsbin.com/atibig/1/editは
トラヴィス

16
これは引用符と二重引用符をエスケープしません。wonko.com/post/html-escaping
Lior

601

moustache.jsからのソリューションあります

var entityMap = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  "'": '&#39;',
  '/': '&#x2F;',
  '`': '&#x60;',
  '=': '&#x3D;'
};

function escapeHtml (string) {
  return String(string).replace(/[&<>"'`=\/]/g, function (s) {
    return entityMap[s];
  });
}

7
奇妙なことに、'10進形式でエンティティにマッピングされてい/ますが、16進形式を使用しています。
mklement0 2013

43
これは受け入れられる答えであるはずです-シンプルで効率的であり、依存関係を必要とせず、意図したとおりにハックすることなく、意図したとおりに動作します。
lorefnon 2013

6
変換に関するガイダンス何\nには<br>
amwinter 2013年

2
:ここでは、ソースへの更新されたリンクですgithub.com/janl/mustache.js/blob/...
mjackson

8
@amwinter、 "\ n"を追加する上記のスクリプトを拡張しました。エンティティマップに '<br>'を追加し、正規表現を/ [&<> "'\ /] | [\ n] / gに
更新しました

182
$('<div/>').text('This is fun & stuff').html(); // "This is fun &amp; stuff"

出典:http : //debuggable.com/posts/encode-html-entities-with-jquery : 480f4dd6-13cc-4ce9-8071-4710cbdd56cb


11
上記の回答で述べたように、このソリューションは空白を保持することを保証されていません。
geofflee

47
これは、単一引用符または二重引用符をエスケープするためには何もしないことに注意してください。値をHTML属性に入れることを計画している場合、これは問題になる可能性があります。
Kip

6
@Kip:@travisは、jQueryのattr()メソッド(少なくとも1.8.3以降)が独自のエンコードを行うため、エンコードされていない文字列を直接渡すことができることを発見しました。例:$('<div/>').attr('test-attr', '\'Tis "fun" & stuff')[0].outerHTML
mklement0 2013

1
@tarekahf変だ。どのバージョンのjQueryを使用していますか?サンプルコードをそのままコピーして貼り付ければ機能しますか?ここで最新のjQuery(3.1.0)で正常に動作します:jsbin.com/fazimigayo/1/edit?html,js,console,output(そしてそれはすべての以前のバージョンでも動作するはずです)
Henrik N

1
@tarekahf $('<div/>')div、DOMに接続されていない新しい要素を作成します。したがって、既存の要素は変更されません。jQueryが同じ$()関数を使用して要素($('div'))を検索し、要素を作成する方法と、それ以外にいくつかのことを行う方法とでは少し混乱します…:)
Henrik N

61

HTMLにエスケープする場合、本当に必要だと考えることができるのは3つだけです。

html.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");

あなたのユースケースに応じて、あなたも同じようなことを行う必要があります"します&quot;。リストが十分に大きくなった場合は、配列を使用します。

var escaped = html;
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g, "&gt;"], [/"/g, "&quot;"]]
for(var item in findReplace)
    escaped = escaped.replace(findReplace[item][0], findReplace[item][1]);

encodeURIComponent() HTMLではなく、URLに対してのみエスケープします。


13
問題のHTMLがすでにエンティティをエスケープしている場合、この正規表現は奇妙な結果を生成します。たとえば、「Tom&amp; Jerry」をエスケープすると、「Tom&amp; amp; Jerry」が生成されます
Ryan

12
ローカルでのvar宣言に使用してくださいitem。とにかく、for … in配列をループするときはループを使用しないでください。for代わりに通常のループを使用してください。ああ、そうではありencodeURIComponentませんescapeURIComponent
Marcel Korpel 2011年

3
タグ属性を使用している場合は、引用符や二重引用符もエスケープする必要があります。htmlspecialcharsのPHPドキュメントには、実行する変換の便利なリストが含まれています。php.net/htmlspecialchars
geofflee

4
新しい人へのちょっとしたリマインダーですが、ウェブサイトのどこかに英語以外の文字を含めるつもりの場合は、これを使用しないでください&eacute。参考のために、htmlエンティティのリストを以下に示します。w3schools.com
tags

11
@ライアン:このソリューションは既にエンコードされた文字列を正しく処理しないことを指摘する価値はありますが、同じことがこのページのほとんどのソリューション(おそらくすべてのソリューション)に当てはまることは何の価値もありません。
mklement0 2013

37

アンダースコアを使用するのに十分簡単:

_.escape(string) 

Underscoreは、ネイティブjsが提供しない多くの機能を提供するユーティリティライブラリです。アンダースコアと同じAPIであるlodashもありますが、よりパフォーマンスが高くなるように書き直されました。


36

これを行う小さな関数を書きました。それが唯一の脱出"&<および>(通常はそれはあなたがとにかく必要なすべてのです)。これは、1つ だけを使用.replace()してすべての変換を行うという点で、以前に提案されたソリューションよりも少しエレガントです。(編集2:元のコードに興味がある場合は、この回答の最後を参照してください。

function escapeHtml(text) {
    'use strict';
    return text.replace(/[\"&<>]/g, function (a) {
        return { '"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' }[a];
    });
}

これは単純なJavascriptであり、jQueryは使用されません。

エスケープ/'あまりにも

mklementのコメントに応じて編集します。

上記の関数は、任意の文字を含めるように簡単に拡張できます。エスケープする文字をさらに指定するには、それらを正規表現の文字クラス(つまり内/[...]/g)とchrオブジェクトのエントリの両方に挿入するだけです。(編集2:この機能も同様に短縮しました。)

function escapeHtml(text) {
    'use strict';
    return text.replace(/[\"&'\/<>]/g, function (a) {
        return {
            '"': '&quot;', '&': '&amp;', "'": '&#39;',
            '/': '&#47;',  '<': '&lt;',  '>': '&gt;'
        }[a];
    });
}

上記の&#39;forアポストロフィの使用に注意してください(シンボリックエンティティ&apos;が代わりに使用された可能性があります。XMLで定義されていますが、元々はHTML仕様に含まれていなかったため、すべてのブラウザーでサポートされているわけではありません。参照:HTML文字エンコーディングに関するWikipediaの記事)。10進エンティティを使用する方が16進を使用するよりも広くサポートされていることをどこかで読んだことを思い出しますが、そのソースを今は見つけられないようです。(そして、16進数のエンティティをサポートしない多くのブラウザは存在できません。)

注:エスケープ文字のリストにを追加/'ても、HTMLで特別な意味がなく、エスケープする必要がないため、それほど便利ではありません。

オリジナルescapeHtml機能

編集2:元の関数は変数(chr)を使用して、.replace()コールバックに必要なオブジェクトを格納しました。この変数には、スコープを設定するための追加の無名関数も必要でした。そのため、関数が(不必要に)少し大きく複雑になります。

var escapeHtml = (function () {
    'use strict';
    var chr = { '"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' };
    return function (text) {
        return text.replace(/[\"&<>]/g, function (a) { return chr[a]; });
    };
}());

2つのバージョンのどちらが速いかはテストしていません。その場合は、ここに情報とリンクを自由に追加してください。


時間を割いていただきありがとうございます、@ Zrajm。エスケープする必要がないことの良い点。なぜ両方ともmustache.jsそれをunderscore.js行うのか?後者の話すこと:それは唯一の数値エンティティ(表現認識'および/に、「)大文字六角場合形態UN逃げます。したがって、テキストはエスケープされましたmustache.js-奇妙なことにミックスを使用していますに16進数のをます。および10進形式-で正しくエスケープ解除されませんunderscore.js。他の人気のあるライブラリがそれをどのように扱っているのでしょうか。
mklement0 2013

1
小文字の16進形式が最もサポートされている形式であるため、(おそらく)ライブラリはこの形式に変換する必要があります。(もちろん、両方の形式がからの変換時に機能するはずです。)–アポストロフィ'は、XMLに予約済みの機能がある(したがって、XHTMLだと思いますか?)。これが、XML(HTMLではない)に名前付きエンティティがある理由&apos;です。正確になぜ、またはどのように「予約」されているかはわかりません。–スラッシュはURLでは特別ですが、実際にはエスケープHTMLに含めるためのスラッシュは保証されていません(URLエンコードはまったく異なるため)。
zrajm

Re &apos;:正解:XHTMLでのみ安全に使用できます。クラウドソースの口から直接-強調鉱山:「(...)準拠するHTMLプロセッサによって読み取られる(...)&apos;またはカスタムエンティティ参照の使用はサポートされない可能性がある(...)」-実際:最近のブラウザはHTMLでもサポートしています。16進数で大文字と小文字を区別します。(同じソース、強調鉱山): "XMLドキュメントではxは小文字でなければなりません。[…] hhhhは大文字と小文字を混在させることができますが、大文字が通常のスタイルです。" 誰がスラッシュをエンコードすることにしたのか疑問に思います。おそらく本当にURIとHTMLエンコーディングの間の混乱だけですか?
mklement0 2013

2
最終的な考え:エンコード/は必要ない'ようですが、エンコードは、エンコードされた文字列が一重引用符で囲まれた属性値として使用されている場合を安全に処理するのに役立ちます
mklement0 2013

これらはどちらも遅いです。2桁のマージンによる最速のソリューションは、関数の代わりに文字列が渡される一連の置換です。
Adam Leggett 2017

34

私はこのパーティーにどれほど遅れているかを理解していますが、jQueryを必要としない非常に簡単な解決策があります。

escaped = new Option(unescaped).innerHTML;

編集:これは引用符をエスケープしません。引用符をエスケープする必要がある唯一のケースは、コンテンツがHTML文字列内の属性にインラインで貼り付けられる場合です。これが良いデザインになるケースを想像するのは難しいです。

編集3:最速のソリューションについては、Saramからの上記の答えを確認してください。これが一番短いです。


これは、引用符を変更しない-少なくとも今のFirefox 52に
getsetbro

1
引用符のエスケープは、属性で機能的にのみ関連があります。私たちが脱出しているため<>、生成されたコンテンツの意図は、属性に行くことでない限り、同様に引用符をエスケープしてもメリットは、ありません。
Adam Leggett 2017年

31

以下は、クリーンでクリアなJavaScript関数です。「少数<多く」などのテキストを「少数&多く」にエスケープします。

function escapeHtmlEntities (str) {
  if (typeof jQuery !== 'undefined') {
    // Create an empty div to use as a container,
    // then put the raw text in and get the HTML
    // equivalent out.
    return jQuery('<div/>').text(str).html();
  }

  // No jQuery, so use string replace.
  return str
    .replace(/&/g, '&amp;')
    .replace(/>/g, '&gt;')
    .replace(/</g, '&lt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&apos;');
}

28

最後のテストの後、ブラウザ間で互換性のあるネイティブのjavaScript(DOM)ソリューションを最速かつ完全に推奨できます。

function HTMLescape(html){
    return document.createElement('div')
        .appendChild(document.createTextNode(html))
        .parentNode
        .innerHTML
}

それを何度も繰り返す場合、一度準備した変数でそれを行うことができます:

//prepare variables
var DOMtext = document.createTextNode("test");
var DOMnative = document.createElement("span");
DOMnative.appendChild(DOMtext);

//main work for each case
function HTMLescape(html){
  DOMtext.nodeValue = html;
  return DOMnative.innerHTML
}

私の最終的なパフォーマンス比較を見てください(スタックの質問)。


2
2つのノードを使用する必要がありますか?たった1つの方法:var p = document.createElement('p'); p.textContent = html; return p.innerHTML;
Dan Dascalescu、2015

2
@DanDascalescu:MDNによると、このtextContent機能はChrome 1 +、Firefox 2、IE9、Opera 9.64およびSafari 3でのみサポートされています(後者の2つは「おそらく以前」と注釈が付けられています)。したがって、それはOPの「完全にブラウザに互換性がある」という主張を破ります。
zb226 2015

p.innerText = html; return p.innerHTML
Bekim Bacaj


15

escapeHTML()文字列オブジェクトにメソッドを追加するmustache.jsの例を拡張しました。

var __entityMap = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': '&quot;',
    "'": '&#39;',
    "/": '&#x2F;'
};

String.prototype.escapeHTML = function() {
    return String(this).replace(/[&<>"'\/]/g, function (s) {
        return __entityMap[s];
    });
}

そうすれば、とても使いやすいです "Some <text>, more Text&Text".escapeHTML()


便利ですが、__entityMap関数のローカルスコープにも移動しました。そして、これらすべてをラップif (typeof String.prototype.escapeHTML !== 'function'){...}
FlameStorm 2017

15

escape() そして unescape() URLのではなく、HTMLのためのエンコード/デコード文字列に意図されています。

実際、私は次のスニペットを使用して、フレームワークを必要としないトリックを実行します。

var escapedHtml = html.replace(/&/g, '&amp;')
                      .replace(/>/g, '&gt;')
                      .replace(/</g, '&lt;')
                      .replace(/"/g, '&quot;')
                      .replace(/'/g, '&apos;');

あなたが"s を持つつもりなら、あなたは少なくとも'と ``をほつれに追加する必要があります。これらは、htmlの要素内の文字列タグデータにのみ必要です。HTMLデータ自体(タグの外側)の場合、最初の3つだけが必要です。
マリウス

10

underscore.jsがある場合は、以下を使用します_.escape(上記のjQueryメソッドよりも効率的です)。

_.escape('Curly, Larry & Moe'); // returns: Curly, Larry &amp; Moe

5

あなたが正規表現のルートを使用している場合、上記のtghwの例にエラーがあります。

<!-- WON'T WORK -  item[0] is an index, not an item -->

var escaped = html; 
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g,"&gt;"], [/"/g,
"&quot;"]]

for(var item in findReplace) {
     escaped = escaped.replace(item[0], item[1]);   
}


<!-- WORKS - findReplace[item[]] correctly references contents -->

var escaped = html;
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g, "&gt;"], [/"/g, "&quot;"]]

for(var item in findReplace) {
     escaped = escaped.replace(findReplace[item[0]], findReplace[item[1]]);
}

2
for(findReplaceのvar item){escaped = escaped.replace(findReplace [item] [0]、findReplace [item] [1]); }
クリススティーブンス

5

これは素晴らしい安全な例です...

function escapeHtml(str) {
    if (typeof(str) == "string"){
        try{
            var newStr = "";
            var nextCode = 0;
            for (var i = 0;i < str.length;i++){
                nextCode = str.charCodeAt(i);
                if (nextCode > 0 && nextCode < 128){
                    newStr += "&#"+nextCode+";";
                }
                else{
                    newStr += "?";
                }
             }
             return newStr;
        }
        catch(err){
        }
    }
    else{
        return str;
    }
}

4
そこでどんな種類の例外を抑制していますか?
Stefan Majewsky

3

バニラjsで簡単にできます。

ドキュメントにテキストノードを追加するだけです。ブラウザによってエスケープされます。

var escaped = document.createTextNode("<HTML TO/ESCAPE/>")
document.getElementById("[PARENT_NODE]").appendChild(escaped)

2
(function(undefined){
    var charsToReplace = {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;'
    };

    var replaceReg = new RegExp("[" + Object.keys(charsToReplace).join("") + "]", "g");
    var replaceFn = function(tag){ return charsToReplace[tag] || tag; };

    var replaceRegF = function(replaceMap) {
        return (new RegExp("[" + Object.keys(charsToReplace).concat(Object.keys(replaceMap)).join("") + "]", "gi"));
    };
    var replaceFnF = function(replaceMap) {
        return function(tag){ return replaceMap[tag] || charsToReplace[tag] || tag; };
    };

    String.prototype.htmlEscape = function(replaceMap) {
        if (replaceMap === undefined) return this.replace(replaceReg, replaceFn);
        return this.replace(replaceRegF(replaceMap), replaceFnF(replaceMap));
    };
})();

グローバル変数なし、一部のメモリ最適化。使用法:

"some<tag>and&symbol©".htmlEscape({'©': '&copy;'})

結果は:

"some&lt;tag&gt;and&amp;symbol&copy;"

2

JQUERYを必要としない2つの簡単な方法...

次のように、文字列のすべての文字エンコードできます。

function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}

それとも、メインキャラクターを対象と心配するについて&、改行、<>"'のように:

function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}

var myString='Encode HTML entities!\n"Safe" escape <script></'+'script> & other tags!';

test.value=encode(myString);

testing.innerHTML=encode(myString);

/*************
* \x26 is &ampersand (it has to be first),
* \x0A is newline,
*************/
<p><b>What JavaScript Generated:</b></p>

<textarea id=test rows="3" cols="55"></textarea>

<p><b>What It Renders Too In HTML:</b></p>

<div id="testing">www.WHAK.com</div>


2

単純なJavaScriptエスケープの例:

function escapeHtml(text) {
    var div = document.createElement('div');
    div.innerText = text;
    return div.innerHTML;
}

escapeHtml("<script>alert('hi!');</script>")
// "&lt;script&gt;alert('hi!');&lt;/script&gt;"

3
コードのみの回答は、問題の解決方法を説明していないためお勧めしません。回答を更新して、この質問ですでに受け入れられている賛成投票の回答がどのように改善されるかを説明してください。また、この質問は9年前のものです。最近の未回答の質問があるユーザーからは、あなたの努力がより高く評価されます。良い答えを書くにはどうしたらいいですかを確認してください。
FluffyKitten 2017年

1
ここ@FluffyKittenは、あなたが知っていただきたいと思います、詳細のすべてに説明し、そのような機能の利点と欠点について極めてnicly書かれたブログ記事です:) shebang.brandonmintern.com/...
db306

@ db306コードのみの回答がスタックオーバーフローのガイドラインを満たしていないため、回答に低品質のフラグが付けられました-「良い回答を書く方法」を参照してください。私のコメントは、それを改善するために何が必要かを説明するためにレビュープロセス中に追加されました。賛成票は、これを支持する他のレビュアーからのものです。コメントへの外部リンクの追加は、SOガイドラインをまだ満たしていません。代わりに、Andrewは自分の回答に関連情報を直接含める必要があります。
FluffyKitten 2017年

brandonmintern DOT comは有効期限が切れており、現在は駐車されています。新しいシバンアドレスはshebang.mintern.net/foolproof-html-escaping-in-javascript/です。
ブランドン

0
function htmlEscape(str) {
    var stringval="";
    $.each(str, function (i, element) {
        alert(element);
        stringval += element
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(' ', '-')
            .replace('?', '-')
            .replace(':', '-')
            .replace('|', '-')
            .replace('.', '-');
    });
    alert(stringval);
    return String(stringval);
}

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

魅力のように働く


テキストはhtmlタグを削除しますが、$( '<div />')。html(t).html(); 作品
バス・ジョブセン2013

0

この回答はjQueryと通常のJSメソッドを提供しますが、これはDOMを使用しないと最短になります。

unescape(escape("It's > 20% less complicated this way."))

エスケープされた文字列: It%27s%20%3E%2020%25%20less%20complicated%20this%20way.

エスケープされたスペースが気になる場合は、以下を試してください。

unescape(escape("It's > 20% less complicated this way.").replace(/%20/g, " "))

エスケープされた文字列: It%27s %3E 20%25 less complicated this way.

残念ながら、このescape()関数はJavaScriptバージョン1.5では廃止されましたencodeURI()またはencodeURIComponent()代替ですが、それらは無視する'ため、コードの最終行は次のようになります。

decodeURI(encodeURI("It's > 20% less complicated this way.").replace(/%20/g, " ").replace("'", '%27'))

すべての主要なブラウザはまだ短いコードをサポートしており、古いウェブサイトの数を考えると、すぐに変わるとは思えません。


これはURLエンコーディング用です。問題はHTMLエスケープについてでしたが、これは非常に異なります。
thelem

@thelem、文字列がHTMLに埋め込まれたJavaScript配列に埋め込まれている場合ではありませんが、プレーンHTMLをエスケープしてテキストとしてすぐに表示できるようにすることに同意します。
Cees Timmerman、2015年


-2

この情報をデータベースに保存する場合、クライアント側のスクリプトを使用してHTMLをエスケープするのは間違っています。これはサーバーで行う必要があります。それ以外の場合、XSS保護をバイパスするのは簡単です。

私のポイントを明確にするために、ここに答えの1つを使用した例があります:

関数escapeHtmlを使用してブログのコメントからHtmlをエスケープし、それをサーバーに投稿するとします。

var entityMap = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': '&quot;',
    "'": '&#39;',
    "/": '&#x2F;'
  };

  function escapeHtml(string) {
    return String(string).replace(/[&<>"'\/]/g, function (s) {
      return entityMap[s];
    });
  }

ユーザーは次のことができます。

  • POSTリクエストパラメータを編集し、コメントをJavaScriptコードに置き換えます。
  • ブラウザコンソールを使用して、escapeHtml関数を上書きします。

ユーザーがこのスニペットをコンソールに貼り付けると、XSS検証がバイパスされます。

function escapeHtml(string){
   return string
}

同意しません。このXSS保護をバイパスするには、実際にブロックしているXSS攻撃(エスケープを無効にするスクリプトを挿入する)を使用する必要があります。たとえば、データが標準のJSONを返さなければならないREST APIからのものである場合など、特定のケースでは、実際にはクライアントでエスケープする方が適切です。
ItalyPaleAle 2015年

@Qualcunoこの検証をクライアントで実行していて、この情報がサーバーに投稿され、信頼できると検証されている場合、ユーザーはリクエストを編集するだけで、スクリプトはデータベースに保存されます。
KauêGimenes

@Qualcuno私は私のポイントをより明確にするためにいくつかの例を含めました。
KauêGimenes

1
問題は、サーバーから受信した文字列をエスケープしてブラウザに表示することでした。あなたが言っているのは、サーバーに送信する前に文字列をエスケープすることです。これは別のことです(そうですが、古いルールに戻ると、クライアントからの入力を盲目的に受け入れません
ItalyPaleAle

@QualcunoこれはStackoverflowでよくある質問です。これは、カバーする重要なポイントだと思います。それが私が答えた理由です。
KauêGimenes

-2

再エスケープを防止しないと、すべてのソリューションは役に立ちません。たとえば、ほとんどのソリューションはにエスケープ&し続け&amp;ます。

escapeHtml = function (s) {
    return s ? s.replace(
        /[&<>'"]/g,
        function (c, offset, str) {
            if (c === "&") {
                var substr = str.substring(offset, offset + 6);
                if (/&(amp|lt|gt|apos|quot);/.test(substr)) {
                    // already escaped, do not re-escape
                    return c;
                }
            }
            return "&" + {
                "&": "amp",
                "<": "lt",
                ">": "gt",
                "'": "apos",
                '"': "quot"
            }[c] + ";";
        }
    ) : "";
};

4
これはダブルエスケープと呼ばれ、入力データがまだエスケープされていないことを確認して修正する必要があります。文字通り表示したい場合&lt; ユーザーに?または、テキストが他の場所で再利用され、エスケープが発生したかどうかに依存するのでしょうか?
thelem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.