0

メッセージ プロパティ ファイル内のメッセージを指定すると、次のようになります。

message = Change relation <strong>{0}</strong> -> <strong>{1}</strong> to <strong>{2}</strong> -> <strong>{3}</strong>?

プレースホルダーのいずれかのコンテンツがユーザーの影響を受ける文字列である場合、潜在的な XSS を防ぐためにメッセージを HTML エスケープする必要があります ( c:outJSP テンプレートで タグを使用してこれを行います。htmlEscape-タグの属性spring:messageも同様ですが、違いはないと思います)。

ただし、そうすることで、メッセージ<strong>などのマークアップが破損し、出力につながります。

Change relation <strong>Peter</strong> -> <strong>Car</strong> to <strong>Carl</strong> -> <strong>Bus</strong>?

ここでスタックオーバーフローのスレッドを既に読みましたが、XSS には対応していません。

私はこれらのオプションについて考えています:

<strong>1)メッセージ プロパティ ファイルのすべてのタグを一重引用符に置き換えるだけです。html がメッセージ全体をエスケープしても問題はありませんが、メッセージの特定の部分の強調表示が少し少なくなるという欠点があります。

2) メッセージをパーツに分割し、(JSP) テンプレートで個別のマークアップを可能にします。これは、マークアップを正しくするだけでも大変な作業のように感じます。

ここで何か不足していますか?どちらがより良い選択肢ですか、それとも別の選択肢がありますか?

編集: HTMLエスケープなしのメッセージは、私が望むように、次のようになります:

関係をピーター->からカール->バスに変更しますか?

したがって、messages.properties ファイルにあるような html マークアップは、テンプレートに表示されるときにレンダリングされます。

エスケープすると、メッセージは上記のようになり、<strong>タグをレンダリングする代わりに表示します。

4

1 に答える 1

1

次の出力が得られると仮定します。

Change relation &lt;strong&gt;Peter&lt;/strong&gt; -&gt; &lt;strong&gt;Car&lt;/strong&gt; to &lt;strong&gt;Carl&lt;/strong&gt; -&gt; &lt;strong&gt;Bus&lt;/strong&gt;

エスケープする必要がある部分だけでなく、HTML 文字列全体をエスケープしているようです。

各値を個別にエスケープ{#}してから、HTML に配置する必要があります。エスケープする必要がある一般的な値は<>、 、'"、および&ですが、可能であればアンチ xss ライブラリとテンプレート システムを使用してください。

潜在的に危険な部分をすべて回避したら、次のようなものを使用できます<c:out value="${msg}" escapeXml="false"/>。これは私が知っている言語/フレームワークではありませんが、実際の HTML とエスケープされたバージョンを出力する方法が必要です。信頼できない部分を適切に回避する限り、どのような方法でも問題ありません。

于 2015-09-22T14:28:48.657 に答える