目次
Xssオプションとは?
オプション名 | オプションの機能詳細 |
---|---|
-Xss | スレッド・スタック・サイズを設定します。 スレッド・スタックは、各Javaスレッドが内部的に使用するために割り当てられるメモリー領域です。ここにスレッドのローカルの実行状態が格納されます。 |
例えば、次のように指定すると、デフォルトのスタック・サイズを512KBに設定可能です。
java -Xss:512k myApp
Xssオプションは、以下のような場合に設定すべきですオプションとなっています。
- StackOverflowError:スタックサイズが制限より大きいため値を増やす
- OutOfMemoryError:スレッド数が多すぎる、もしくは各スレッドに大きなスタックがあるため値を減らす
OutOfMemoryErrorの場合、Xssの設定値が大きすぎるのが原因ため、Xssオプションを使用して調整します。
Xssの設定・チューニング方法
-Xssオプションは、バイト単位でスタックサイズを指定可能です。
例えば、スタックサイズを256KBで設定する際、下記のように指定します。
-Xss512k
なお、mainメソッドが実行されるスレッドは、Java VMの起動前に作成されたスレッド(Java APIで作成されたスレッドではない)のため、-Xssオプションで指定したスタックサイズにはなりません。
自動コンパイル用スレッド(自動的にJDK/JRE内で実行されるJavaメソッドをコンパイルする専用スレッド)のスタックサイズは“-XX:CompilerThreadStackSizeオプションで指定できます。
ただし、通常であれば自動コンパイル用スレッドのスタックサイズは指定の必要がありません。
-XX:CompilerThreadStackSizeオプションは、キロバイト単位で自動コンパイル用スレッドのスタックサイズ指定します。
例えば、スタックサイズを1024KBに設定する場合、以下のように指定しましょう。
-XX:CompilerThreadStackSize=1024
Xssのデフォルト値について
Xssのデフォルト値は以下の通りです。
プラットフォーム | デフォルト |
---|---|
Windows IA32 | 64KB |
Linux IA32 | 128KB |
Windows x86_64 | 128KB |
Linux x86_64 | 256KB |
Windows IA64 | 320KB |
Linux IA64 | 1024KB (1MB) |
Solaris Sparc | 512KB |
※参照:-X コマンドライン オプション
XssとXmxの違いは?
XssとXmxの違いは下記の通りです。
- -Xss:スレッド・スタック・サイズを設定します
- -Xmx:ヒープ・メモリ全体の最大サイズを変更します
Xmxオプションについては、以下の記事で詳しく解説しています。
【関連記事】
▶︎javaコマンド「-Xmx」オプションのデフォルトや確認・設定方法を紹介!
ちなみに、Xmsオプションについては、以下の記事で解説しています。
【関連記事】
▶︎javaコマンドの「-Xms」について解説|メモリ・確認方法などまとめ
JavaのXSS(クロスサイトスクリプティング)について
クロスサイトスクリプティング (XSS)とは、利用者の入力データを使ってページを動的に出力するWebアプリケーションの脆弱性から、ブラウザ上で悪意のあるスクリプトを実行させるセキュリティ攻撃のことです。
XSSの多くが、攻撃者が用意した「電子メール内に入れ込んだリンク」や「Webページ」から、わざと脆弱性のあるWebサイトに誘導する形になります。
このことから、クロスサイト (サイトをまたがる) スクリプティングと名前がつけられました。
例えば、簡単なものだと利用者がWebフォームのテキストボックスにテキストを入力して送信すると、そのテキストを含んだWeb(HTML)ページが結果として返ってくるWebアプリケーションを見てみましょう。
テキスト入力部分に、下記のようなテキストを入力したとします。
alert("クロスサイトスクリプティング");
上記のテキストは、実行されると画面に「クロスサイトスクリプティング」と書かれたポップアップが表示されます。
そのため、Webアプリケーション側で入力データのチェックを行っていない場合、出力された Webページに上記スクリプトがそのまま含まれて実行されてしまいます。
上記は簡単なポップアップ表示でしたが、攻撃者はもっと悪意のあるスクリプトを使用して、Cookie情報の詐取・偽ページへ誘導・第三者へのフォーム情報の送信など、さまざまな操作ができてしまいます。
このようなXSSは、Javaで作成したアプリケーションでも起こりうることです。
そのため、しっかり対策する必要があります。
XSSの種類
XSS攻撃には、大きく分けて「Stored XSS Attacks」と「Reflected XSS Attacks」の2つがあります。
Stored XSS Attacksは、悪意のあるコードが、永久的にターゲットのサーバ上(データベースなど)に格納されるXSS攻撃です。
利用者は格納されている情報を要求する際に、サーバから悪意あるスクリプトを取得し、実行してしまいます。
一方、Reflected attacksは、リクエストの一部としてサーバに送信された悪意のあるコードが、エラーメッセージや検索結果、その他さまざまなレスポンスからリフレクション(プログラムがプログラム自身を操作する機能)されるXSS攻撃です。
利用者が、悪意のあるリンクをクリックするか、攻撃者が細工したフォームを送信すると、挿入されたコードが利用者のブラウザに攻撃を反映した結果を返します。
その結果、信頼できるサーバからきた値となっているためブラウザは悪意のあるコードを実行してしまうのです。
Stored XSS Attacks と Reflected XSS Attacks の両方とも、出力値をエスケープすることでXSS攻撃を防げます。
利用者が入力したデータを、そのまま出力してしまっている場合、XSSの脆弱性にさらされている状態です。
XSSの対策方法
XSSが起きないように対策するには、アプリケーション利用者からの入力データの検証と、出力データの適切なエンコーディングの徹底が重要です。
入力データを遷移先のページで表示する前に必ず、データの長さやデータ型、構文などが問題ない範囲内であるかどうかを検証しましょう。
出力データは、HTMLやXMLなど、出力フォーマットに沿って適切にエンコードします。
また、XSSの脆弱性に対する対処法として、HTMLのマークアップ言語で特定の意味を持つ文字をエスケープする必要があります。
必要に応じて、3種類のエスケープを使い分けましょう。
- Output Escaping
- JavaScript Escaping
- Event handler Escaping
Output Escaping
XSSの脆弱性への対処法として、HTML特殊文字をエスケープすることは基本的な内容です。
HTMLにおいてエスケープが必要な特殊文字とエスケープ後の例は、下記の通りになっています。
エスケープ前 | エスケープ後 |
---|---|
& | & |
< | < |
> | > |
“ | " |
‘ | ‘ |
JavaScript Escaping
JavaScript特殊文字をエスケープすることも、XSSの脆弱性への対処法の一つです。
利用者の入力からJavaScriptの文字列リテラルを動的に生成する場合に、エスケープを行います。
JavaScriptにおいてエスケープが必要な特殊文字とエスケープ後の例は、下記の通りです。
エスケープ前 | エスケープ後 |
---|---|
‘ | \’ |
“ | \” |
\ | \\ |
/ | \/ |
< | \x3c |
> | \x3e |
0x0D(復帰) | \r |
0x0A(改行) | \n |
Event handler Escaping
JavaScript のイベントハンドラ値をエスケープする場合、「f:h()」や「f:js()」を使うのではなく、「f:hjs()」を使用します。
「${f:h(f:js())}」と同義ですね。
理由としては、下記のようイベントハンドラの値に「alert(“XSS Attack”);」を指定された場合、別のスクリプトを挿入できてしまいます。
そのため、文字参照形式にエスケープ後、HTMLエスケープをが必要です。