1. ホーム
  2. java

JSP/ServletのWebアプリケーションにおけるXSS対策

2023-08-08 10:25:49

質問事項

JSP/サーブレットのWebアプリケーションで、XSS攻撃を防ぐにはどうしたらよいでしょうか?

どのように解決するのですか?

JSPでのXSS対策は JSTL <c:out> タグまたは fn:escapeXml() 再)表示時のEL機能 ユーザ制御の入力 . これにはリクエストパラメータ、ヘッダ、クッキー、URL、ボディなどが含まれます。リクエストオブジェクトから抽出されるもの全てです。また、データベースに保存されている以前のリクエストからのユーザー制御の入力は、再表示の間にエスケープされる必要があります。

例えば

<p><c:out value="${bean.userControlledValue}"></p>
<p><input name="foo" value="${fn:escapeXml(param.foo)}"></p>

のようなレンダリングされたHTMLを改竄する可能性のある文字をエスケープします。 < , > , " , '& HTML/XML エンティティ のような &lt; , &gt; , &quot; , &apos;&amp; .

Java (Servlet) コードでは無害なので、これらをエスケープする必要はないことに注意してください。においてエスケープすることを選ぶ人もいるかもしれません。 リクエスト 処理中に (Servlet や Filter で行うように) レスポンス 処理 (JSPで行うように) を行いますが、この方法ではデータが不必要に二重にエスケープされる危険性があります (例えば &&amp;amp; ではなく &amp; と表示され、最終的にエンドユーザは &amp; が表示されてしまう)、あるいはDBに保存されたデータが持ち運べなくなる(例えば、HTMLエスケープを全く必要としないJSON、CSV、XLS、PDFなどにデータをエクスポートする場合など)ことがあります。また、ユーザーが実際に何を入力したのかがわからなくなるため、社会的な統制がとれなくなります。サイト管理者としては、どのユーザ/IPがXSSを行おうとしているのかを知りたいと思うでしょうし、そうすれば簡単にそれらを追跡し、それに応じて行動を起こすことができます。リクエスト処理中のエスケープは、ひどく開発されたレガシーウェブアプリケーションの列車事故を可能な限り短時間で修正する必要がある場合にのみ、最後の手段として使用されるべきです。それでも、最終的には JSP ファイルを書き換えて XSS セーフにする必要があります。

のような特定の HTML タグのサブセットのみを許可して、ユーザーが制御した入力を HTML として再表示したい場合。 <b> , <i> , <u> などと入力された場合、ホワイトリストによって入力をサニタイズする必要があります。HTMLパーサーを使えば Jsoup のようなHTMLパーサーを使用することができます。しかし、より良いのはMarkdown(ここStack Overflowでも使用されています)のような人間に優しいマークアップ言語を導入することです。そして、次のようなMarkdownパーサーを使用することができます。 CommonMark のようなMarkdownパーサーを使用することができます。また、HTMLサニタイズ機能も内蔵されています。また マークダウンまたはHTML .

データベースに関してサーバーサイドで唯一懸念されるのは SQL インジェクション の防止です。ユーザー制御の入力をSQLやJPQLクエリで直接文字列連結しないようにし、パラメータ化されたクエリをずっと使っていることを確認する必要があります。JDBC の用語で言うと、これはつまり PreparedStatement の代わりに Statement . JPAで言えば Query .


JSP/ServletからJava EEのMVCフレームワークに移行する方法もあります。 JSF . これは、すべての場所でXSS(とCSRF!)防止を内蔵しています。また JSFにおけるCSRF, XSS, SQLインジェクション攻撃防止機能 .