1

.resx ファイルを取り込み、.resx ファイル内のすべての名前と値のペアのプロパティを含む JavaScript オブジェクトを作成するユーティリティを作成しています。.resx の値の 1 つが

このディーラーは電子注文を受け付けます。

/r/nクリックして、このディーラーに{0}を注文してください。

次のように、名前と値のペアを js オブジェクトに追加しています。

streamWriter.Write(string.Format("\n{0} : \"{1}\"", kvp.Key, kvp.Value));

When kvp.Value = "このディーラーは電子注文を受け付けています./r/nクリックして、このディーラーから {0} を注文してください。"

これにより、StreamWriter.Write() は実際に「注文」の間に改行を挿入します。そして「クリック」は、JavaScriptの出力を自然に台無しにします。

@ を使用して、string.Format を使用せずにさまざまなことを試しましたが、うまくいきませんでした。助言がありますか?

編集: このアプリケーションはビルド中に実行され、後で展開されるいくつかの JavaScript ファイルを取得するため、アプリ開発者以外の誰もアクセス/実行することはできません。したがって、ここでは明らかに文字をエスケープする方法が必要ですが、XSS 自体はそれほど重要ではありません。

4

3 に答える 3

3

このコードに到達するまでに、問題はすでに発生しています。String.Format は、リテラル\nおよび\r置換された文字列 ({0}など) を改行と CR に「展開」しないため、おそらく .resx ファイルの読み取り中に、以前の時点で発生したに違いありません。

考えられる解決策は 2 つあります。1つは、DonaldRayの回答へのコメントで発見したように、この置換を明示的に逆にし、リテラル改行を2文字に置き換えることです\n:

kvp.Value.Replace("\r",      // <-- replaced by the C# compiler with a literal CR character
                  "\\r");    // <-- "\\" replaced by the C# compiler with a single "\",
                             // leaving the two-char string "\r"

文字列に表示される可能性のあるすべての文字に対して同じことを行う必要があります。\n と \r が最も一般的で、次に \t (タブ) です。ほとんどの開発ツールではおそらくこれで十分です。

string formatted = kvp.Value.Replace("\r", "\\r")
                            .Replace("\n", "\\n")
                            .Replace("\t", "\\t");

または、コードを読み取る .resx ファイルの上流を調べて、これらの文字シーケンスを明示的に展開している部分を見つけて削除することもできます。可能であれば、これはより良い一般的な解決策になります。

于 2010-04-26T20:23:03.883 に答える
1

Microsoft のAnti-XSS Libraryを使用して、文字列をエスケープする必要があります。

于 2010-04-26T19:33:07.483 に答える
1

バックスラッシュをエスケープするだけです。

kvp.Value = kvp.Value.Replace(@"\", @"\\");

resx ファイルから読み取るときに、これを行う必要がある場合があります。

于 2010-04-26T19:40:31.850 に答える