0

OWASP によると、DOM セーフで HTML を動的に更新するには、次のことをお勧めします。

  1. HTMLエンコーディング、そして
  2. 次の例に示すように、すべての信頼できない入力をエンコードする JavaScript: element.innerHTML = “<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>”;

サーブレットがユーザー入力 (AJAX 要求として受信) を受信し、データを処理し、要素の値を設定して (を使用してdocument.getElementById("elementID").innerHTML = data;) DOM を動的に変更するために使用されるテキスト応答を送信する Web アプリケーションがあります。

DOM ベースの XSS を防ぐには、ESAPI エンコーダーを使用して HTML と JavaScript をエスケープする必要があります。

String htmlEscapedStr=ESAPI.encoder().encodeForHTML(content);
String JSEscapedStr=ESAPI.encoder().encodeForJavaScript(htmlEscapedStr);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(JSEscapedStr);

;

または、エンコードされていない文字列をストリームに書き込んでも安全ですか

response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(content);
4

1 に答える 1

0

contentはプレーンテキストであると想定しており、HTML を自分自身に含めることは望んでいませんcontent。値は JavaScriptに挿入されていないため、JavaScript 用にエンコードする必要はありません。値はJavaScript コンテキストで JavaScript によって設定されているだけです。したがって、正しい方法は次のとおりです。innerHTML

String htmlEscapedStr=ESAPI.encoder().encodeForHTML(content);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(htmlEscapedStr);

text/plainこのコンテキストでは、データを受信するアプリケーション (Web ページ) がコンテンツ タイプ自体を解釈する必要がないため、そのままにしておくコンテンツ タイプは問題ありません。これは、単に戻り値に設定するinnerHTMLだけだからです。

または、エンコードされていない文字列をストリームに書き込んでも安全ですか

「信頼されていない」データが含まれている場合content(「信頼されていない」読み取りは「ユーザー入力から」または「外部ソースから」)、XSS 攻撃の一部としてスクリプト コードが含まれている可能性があります。信頼できるソースからのものであり、プレーン テキストとしてフォーマットされている場合、 などの文字は<出力のフォーマットを壊す可能性がありますが、セキュリティ上の問題は発生しません。例えば ​​のような数式がブラウザ1 < 2 > 1.5に出力さ1 1.5れます。

于 2014-12-16T10:07:05.130 に答える