3

C#/ASP.NETでJavaScriptをエスケープする正しい方法は何ですか? 例えば:

<script>
var abc = '<%= def%>';
</script>
<div onclick="myfunction('<%= Xyz%>')" />

これについては確かに質問がありますが、さまざまなオプションをリストしています。がある

  • System.Web.HttpUtility.JavaScriptStringEncode
  • System.Web.Util.HttpEncoder.JavaScriptStringEncode
  • Microsoft.Security.Application.Encoder.JavaScriptEncode
  • Microsoft.JScript.GlobalObject.escape
  • System.Text.Encodings.Web.JavaScriptEncoder (コア)
  • 他の?

これらのメソッドの結果は常に同じであるとは限らず、それらのドキュメントはユース ケースを明確に説明していないようです。

後者の例の場合、おそらく HTML と JS エンコーディングの両方を使用する必要があります。HTML エンコーディングなしで使用すると、System.Web.HttpUtility.JavaScriptStringEncode を悪用することができました。ただし、Microsoft.Security.Application.Encoder.JavaScriptEncode は非常に徹底しているため、適切な HTML エンコーディングを追加しても、それを悪用する方法がわかりません。
JSFiddle: https://jsfiddle.net/1afn5dky/

それぞれの方法に好ましいユースケースはありますか?

4

1 に答える 1

1

特定のユースケースに対する最良の答えは、 OWASP チートシート ルール #3から導き出すことができます。

一般に、これは 1) 正しいエンコーディング アクションとその順序、および 2) 実装に要約されます。

ここでのアクションと順序のエンコードは非常に簡単です。JavaScript エンコードを行う必要があります。onclickただし、ユースケースに注意してください。あなたが言及したものがコードを実行するように設計されている場合は、functionおそらく追加のサニタイズ層を考え出す必要があります。このSOスレッドの詳細

実装に関しては、owasp のチートシートでは、.NET Framework および .NET Core に現在存在するAntiXssEncoderクラスに取って代わられている、廃止された AntiXSS について言及しています。これは、web.config で次のように設定HttpUtilityすると、舞台裏のクラスで使用できます。

<httpRuntime ...
  encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

この設定がない場合、HttpUtility クラスはバックグラウンドで HttpEncoder を使用します。(あなたの特定のユースケースでは、JavaScriptStringEncodeメソッドは実際には両方のクラスで同じです)。

最初のシナリオでは:

<script>
var abc = '<%= def%>';
</script>

def がデータルール 3.1に評価される場合、それらを個別の要素に入れ、json 文字列として評価し、json パーサーを使用してデータを読み取ることを特に推奨しています。

<div id="init_data" style="display: none">
 <%= html_encode(def.to_json) %>
</div>

// external js file
var dataElement = document.getElementById('init_data');
// decode and parse the content of the div
var abc = JSON.parse(dataElement.textContent);

ただし、javascript 関数呼び出しに評価されるためにこれが不可能な場合def、このアプローチは不可能です。このシナリオでは、コード生成は通常悪い考えであり、バックエンド側またはフロントエンドで完全なコード生成を行うことができるため、設計を変更する必要があると思います (適切なフロントエンド フレームワークを使用)。何らかの奇妙な理由でこれらのオプションのいずれも実行できない場合は、ネストされたコンテキスト (HTML の JS) をエンコードする必要があり、さらに、結果の JavaScript 呼び出しのサニタイズも行う必要があります。

2 番目の例<div onclick="myfunction('<%= Xyz%>')" />は、ルール 3 に関して使用する必要があるため、これHttpUtility.JavaScriptStringEncodeで十分です。ただし、関数がパラメーターを実行する場合は、サニタイズも行う必要があります。

于 2020-11-05T08:25:35.457 に答える