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 つの方法でこれを解決できます。
fn:escapeXml()
弾丸を噛んで、またはによってユーザー制御の入力を再表示するすべての EL-in-template-text を置き換えて<c:out>
、将来これに注意を払うようにあなた自身とあなたのチームに教えてください。ヒント、Eclipse のような少しまともな IDE には、regex ベースのすべてのファイルの検索と置換があります。
DB に挿入する前に、悪意のある HTML を削除する一種の DB インターセプターがあります。必要に応じて、DB スクリプトを実行して既存のデータをサニタイズします。ただし、これは実際の解決策というよりも回避策です。
JSP EL リゾルバを、すべての HTML をエスケープするカスタム リゾルバに置き換えます。ただし、これには、本当に必要なときに EL でプレーンな HTML を表示できないという欠点があります。
組み込みの HTML エスケープ機能を備えた適切な MVC フレームワークを使用します。ただし、これは個々の EL 式を修正するだけではありません。