13

テンプレートエンジンとしてjspxを使用しています。${user.firstName} や "${mail.subject}" などの何百もの el 式を含む多数の画面があります。

そして、この HTML コードはすべてデフォルトではエスケープされません。フィールドに < または " を含むものがある場合、画面は失敗します。いつでも fn:escapeXml を使用できますが、すべての場所でこれを行うのは本当に退屈です。

1) デフォルトでエスケープする方法はありますか?

私が知っている唯一の方法は、JSP コンパイラ (Tomcat の jasper など) をハックすることです。しかし、それは行く方法ではありません。

2) el でエスケープされていない HTML が必要になるのはなぜですか? HTML をテンプレートの外部 (データベースなど) に保存することはお勧めできません。

3) テンプレート エンジンが (XSLT で行われるように) それを自動的に処理する必要があると確信しています。手動エスケープ (fn:escapeXml) は、SQL 手動エスケープ (JDBC setParam の代わりに使用される) のような匂いがします: ボイラープレート コードであり、SQL インジェクション (この場合はクロスサイト スクリプティング) に適しています。

4

2 に答える 2

11

1) デフォルトでエスケープする方法はありますか?

ビンテージ JSP にはありません。ただし、その後継の Facelets はデフォルトでそれらをエスケープします。エスケープを無効にする唯一の方法は、<h:outputText value="#{bean.foo}" escape="false" />代わりに#{bean.foo}.


2) el でエスケープされていない HTML が必要になるのはなぜですか? HTML をテンプレートの外部 (データベースなど) に保存することはお勧めできません。

ただし、サニタイズされた HTML を保存することは、一般的に行われている以上のことです。たとえば、属性がすでに削除されている<p><b><i>および onなどの無害な HTML タグの小さなサブセットを許可します。on*


3) テンプレート エンジンが (XSLT で行われるように) それを自動的に処理する必要があると確信しています。手動エスケープ (fn:escapeXml) は、SQL 手動エスケープ (JDBC setParam の代わりに使用される) のような匂いがします: ボイラープレート コードであり、SQL インジェクション (この場合はクロスサイト スクリプティング) に適しています。

JSP は古いビュー テクノロジです。これは実際には柔軟なテンプレート エンジンではありません。

SQLインジェクションは通常、PreparedStatement代わりに使用することで防止されますStatement(または、「生のJSP」の代わりにMVCフレームワークを使用するだけでXSSの問題を防止できるように、「生のJDBC」の代わりにORMフレームワークを使用することで防止できます)。


具体的な問題に関しては、基本的に 4 つの方法でこれを解決できます。

  1. fn:escapeXml()弾丸を噛んで、またはによってユーザー制御の入力を再表示するすべての EL-in-template-text を置き換えて<c:out>、将来これに注意を払うようにあなた自身とあなたのチームに教えてください。ヒント、Eclipse のような少しまともな IDE には、regex ベースのすべてのファイルの検索と置換があります。

  2. DB に挿入する前に、悪意のある HTML を削除する一種の DB インターセプターがあります。必要に応じて、DB スクリプトを実行して既存のデータをサニタイズします。ただし、これは実際の解決策というよりも回避策です。

  3. JSP EL リゾルバを、すべての HTML をエスケープするカスタム リゾルバに置き換えます。ただし、これには、本当に必要なときに EL でプレーンな HTML を表示できないという欠点があります。

  4. 組み込みの HTML エスケープ機能を備えた適切な MVC フレームワークを使用します。ただし、これは個々の EL 式を修正するだけではありません。

于 2011-05-04T18:32:36.950 に答える
7

はい、デフォルトですべての EL 式をエスケープできます。これは、カスタムELResolverを登録することで実行できます。たとえば、このサイトを参照して、その方法の例を確認してください: http://pukkaone.github.com/2011/01/03/jsp-cross-site-scripting-elresolver.html

于 2013-01-11T17:29:39.533 に答える