JSP/ServletのWebアプリケーションにおけるXSS対策
質問事項
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 エンティティ
のような
<
,
>
,
"
,
'
と
&
.
Java (Servlet) コードでは無害なので、これらをエスケープする必要はないことに注意してください。においてエスケープすることを選ぶ人もいるかもしれません。
リクエスト
処理中に (Servlet や Filter で行うように)
レスポンス
処理 (JSPで行うように) を行いますが、この方法ではデータが不必要に二重にエスケープされる危険性があります (例えば
&
が
&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インジェクション攻撃防止機能 .
関連
-
javaの非静的メソッドを静的に参照することができない
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでユーザー入力をサニタイズするにはどうすればよいですか?
-
[解決済み] JSP/Servletを使用してサーバーにファイルをアップロードするにはどうすればよいですか?
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
-
[解決済み】サーブレットはどのように動作するのですか?インスタンス化、セッション、共有変数とマルチスレッド
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
強制型変換について
-
API の戻り値を処理するために ResponseEntity を使用する
-
Junitのユニットテストエラー
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。