JSONオブジェクトを返すASP.NET MVCアクションがあります。
JSON:
{status: "1", message:"", output:"<div class="c1"><div class="c2">User generated text, so can be anything</div></div>"}
現在、私のHTMLはそれを壊しています。出力フィールドにユーザーが生成したテキストがあるので、エスケープする必要があるすべてのものをエスケープする必要があります。
誰かが私が脱出する必要があるすべてのもののリストを持っていますか?
私はJSONライブラリを使用せず、文字列を自分で作成します。
http://json.org/ をご覧ください。クリスが提案したものとは少し異なるエスケープ文字のリストを主張しています。
\"
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits
JSONの文字列リテラルを作成するときにエスケープできる特殊文字のリストは次のとおりです。
\bバックスペース(ASCIIコード08) \fフォームフィード(ASCIIコード0C) \n改行 \rキャリッジリターン \tタブ \v垂直タブ \'アポストロフィまたは一重引用符 \"二重引用符 \\バックスラッシュ文字
リファレンス: 文字列リテラル
これらのいくつかは、他のものよりもオプションです。たとえば、タブ文字をエスケープするか、タブリテラルのままにするかに関係なく、文字列は完全に有効である必要があります。ただし、バックスラッシュと引用符を確実に処理する必要があります。
JSONの公式ECMA仕様のセクション9( http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf )で説明されているように、次の文字はエスケープする必要があります:
U+0022
("
、引用符)U+005C
(\
、バックスラッシュまたは逆固相線)U+0000
からU+001F
(ASCII制御文字)さらに、JSONをHTMLに安全に埋め込むには、次の文字もエスケープする必要があります。
U+002F
(/
)U+0027
('
)U+003C
(<
)U+003E
(>
)U+0026
(&
)U+0085
(次の行)U+2028
(行区切り記号)U+2029
(段落区切り記号)上記の文字の一部は、標準で定義されている次の短いエスケープシーケンスでエスケープできます。
\"
は、引用符文字(U + 0022)を表します。\\
は、逆の固相線文字(U + 005C)を表します。\/
は、固相線文字(U + 002F)を表します。\b
は、バックスペース文字(U + 0008)を表します。\f
は、フォームフィード文字(U + 000C)を表します。\n
は、改行文字(U + 000A)を表します。\r
は、復帰文字(U + 000D)を表します。\t
は、文字集計文字(U + 0009)を表します。エスケープする必要がある他の文字は、\uXXXX
表記を使用します。つまり、\u
の後にコードポイントをエンコードする4桁の16進数が続きます。
\uXXXX
は、短いエスケープシーケンスの代わりに使用することも、オプションでBasic Multilingual Plane(BMP)から他の文字をエスケープするためにも使用できます。
spec から:
エスケープする必要がある文字を除き、すべての文字を引用符で囲むことができます。引用符(U + 0022)、逆ソリッドス[バックスラッシュ](U + 005C)、および制御文字U + 0000からU + 001F
という理由だけでBell(U + 0007)には1文字のエスケープコードはありませんが、エスケープする必要がないという意味ではありません。 Unicodeエスケープシーケンス\u0007
を使用します。
すぐに、少なくともHTMLタグ内の二重引用符が問題になることがわかります。おそらく、有効なJSONであるためにエスケープする必要があるのはこれだけです。交換するだけ
"
と
\"
ユーザー入力テキストの出力に関しては、HttpUtility.HtmlEncode()を介して実行することを確認して、 XSS攻撃 を回避し、ページの書式設定を台無しにしないようにする必要があります。 。
JSONリファレンスの状態:
any-Unicode-character- except-"-or-\\-or- control-character
次に、標準エスケープコードをリストします。
\"標準JSON引用符 \\バックスラッシュ(エスケープ文字) \/スラッシュ \bバックスペース(asciiコード08) \fフォームフィード(asciiコード0C) \n改行 \rキャリッジリターン \t水平タブ \u 4桁の数字
このことから、リストされているものをすべてエスケープする必要があり、他のすべてはオプションであると想定しました。希望する場合は、すべての文字を\uXXXX
にエンコードするか、印刷できない7ビットASCII文字または\u0020 <= x <= \u007E
range (32 - 126)
。エスケープコードを短くして読みやすさとパフォーマンスを向上させるには、標準文字を最初に使用することが望ましい。
さらに、 RFC 4627 からポイント2.5(文字列)を読み取ることができます。
そのJSON文字列を埋め込んだ場所に応じて、他の文字をエスケープ(さらに)する(またはしない)こともできますが、それはこの質問の範囲外です。