0

この小さな関数は有効なHTMLを返すことができますか?

function HtmlSanitizer(text) {
    return text.replace(/&(?!\s)|</g, function (s) { if(s == '&') return '&amp;'; else return '&lt;'});
}

編集:この関数の目的は、htmlインジェクションを回避することです。だから私は尋ねています。

4

2 に答える 2

1

この関数は、HTML エンティティにエンコードしたいもののごく一部のみを返します。したがって、あなたの質問に対する答えは「いいえ」です。

より完全なものを見つけるために、「javascript html entity encode」などを Google で検索することをお勧めします。

于 2012-11-30T01:15:56.867 に答える
1

それは正規表現です:

  • / /g= グローバル置換、つまり、text文字列内のすべてのオカレンスを置換
  • &= JS Regex の予約文字ではないため、テキスト内のアンパサンドに一致します。
  • (?!)?= 「否定先読み」検索 (貪欲でない検索のための の独立した使用と混同しないでください。
  • \s= 任意の空白文字に一致
  • |<= アンパサンドと一致しなかった場合は、開始山括弧をキャッチしようとします

次に、文字列をキャプチャしてコールバック関数に渡し、 を と&&amp;置き換え<ます&lt;。これは、文字列を HTML エンコードする基本的な方法として機能しますが、私の意見では堅牢ではありません。

SGML (およびその派生物: HTML と XML) は、構文文字が完全にエンコードされることを好むため、アンパスタンド、開き括弧と閉じ括弧、および引用符のすべての出現をエンコードする必要がありますが、提供された関数はこれらのうちの 2 つしか行いません (当然、この2つが最も重要です)。

このエントリを読むことをお勧めします:入力フィールドから属性を読み取ったときに HTML エンコーディングが失われました

于 2012-11-30T01:17:22.043 に答える