2010-12-16 10 views
8

私は、JavaベースのWebアプリケーションでクロスサイトスクリプティング(XSS)を防止するために取り組んでいます。私はすでに、この例のようなサーブレットフィルタを実装しています。http://greatwebguy.com/programming/java/simple-cross-site-scripting-xss-servlet-filter/は、アプリケーションへのすべての入力をサニタイズします。特別なセキュリティ対策として、すべてのJSPでアプリケーションのすべての出力をサニタイズしたいと思います。私はこれがどのように行われ、2つの相補的な選択肢が見つかったかを調べるためにいくつかの研究を行った。XSSを防ぐためにc:outを使用する代わりに

これらのうちの1つは、SpringのdefaultHtmlEscape属性の使用です。これは実装が非常に簡単で(web.xmlのいくつかの行)、出力がバネのタグ(つまり、メッセージタグまたはフォームタグ)のいずれかを通過するときに効果的です。私が発見した他のオプションは、しかし、原因私は(200個の+ JSPファイル)働いているアプリケーションのサイズに、直接ではなく${...}などのEL式を使用し、代わりに第二のアプローチは、完全に動作することを<c:out value="${...}" />

を使用することです。 EL表現の不適切な使用をすべてc:outタグで置き換えることは非常に面倒な作業です。また、将来すべての開発者がc:outタグを使用するというこのコンベンションに固執することは、面倒な作業になるでしょう(コードはどれほど読めないのでしょうか)。

コードの変更が少なくて済むEL式の出力をエスケープする方法はありますか?

答えて

10

サーブレット2.5/JSP 2.1以来、あなたはこれを行うカスタムELResolverを作成することができました。 ServletContextListener#contextInitialized()に登録することができます。

@Override 
public void contextInitialized(ServletContextEvent event) { 
    JspFactory.getDefaultFactory() 
     .getJspApplicationContext(event.getServletContext()) 
     .addELResolver(new YourCustomELResolver()); 
} 

ELResolver#getValue()では、エスケープジョブを実行できます。

あなたの唯一の問題は、許可されている場所でHTMLを表示できないことです(つまり、ホワイトリストの種類別に悪意のあるタグ/属性から既に消化されているためです)。言っ


は、私はあなたの質問の第一パラグラフで述べたように Filterによって 入力中にXSSをエスケープする必要が反対します。ダブルエスケープの危険があります。 HTMLの間でインライン化されるビュー側では、まっすぐに、すなわち の出力のように、害を及ぼす可能性のある箇所でエスケープする必要があります。私はそのXSSフィルタを取り除き、ビュー側でJSTL <c:out>または fn:escapeXml()(またはカスタムELリゾルバ)を使用して修正することに集中することをお勧めしますが、これは絶対的なアプローチではありません。将来のコード管理者は大変感謝しています。

+1

HTMLをエスケープするために 'fn:escapeXml'を使用しないでください。'''を生成しますが、これは標準HTMLエンティティではありません。 –

+1

@Roland:いいえ、そうではありません。 '''を生成します。これはHTMLとXMLの両方で有効です( 'c:out'と同様)。 – BalusC

+0

ああ、それは素晴らしいです。だから私は他の 'escapeXml'関数と混同しているに違いない。確かに、私はJSTL仕様でそれを調べました。これは明示的に言及されています。 –

1

This blog postには、String型のEL式の値をエスケープするカスタムELResolverが記述されています。このカスタムELResolverを登録すると、すべてのEL式の出力からエスケープされます。

<%= "Java expression hopefully returning safe HTML" %> 
1

私はあなたがCを使用する必要はありません同意:JSPは、あなたがそのようなカスタムタグやスクリプトレットとして、EL式を伴わないメカニズムをプログラムでHTMLを出力を必要としなければならない例外的な場合には:すべての変数の周りに出てください。 私は理由を説明するブログを書いたhttp://tech.finn.no/2011/04/08/xss-protection-whos-responsibility/

ここには多く言及されています。

関連する問題