クロスサイトスクリプティング(XSS)について

2019年1月20日

クロスサイトスクリプティング(以降XSSと表示)とは

WEBアプリへの攻撃手法のひとつにこれがあります。では、どの様に攻撃されるのでしょう。アンケートや商品購入サイトで、利用者はなにがしらの情報を入力する箇所があると思います。この入力箇所に悪意のある文字が入力され、この入力内容がWEBブラウザで表示された時、WEBアプリが想定しない表示になり、これを不正に利用することで発生します。

なぜWEBアプリが想定しない表示をWEBブラウザがするのか

大雑把に言うとWEBブラウザは「表示、動作する情報」とこれ以外の「文字や画像の情報」(画像も含めると理解が難しいので以降は「文字の情報」とします)を区別し表示させます。この区別を悪意を持って操作することでWEBアプリが想定しない表示をします。次にこの区別の方法ですが、簡単に言えば「<」と「>」で囲まれた箇所が「表示、動作する情報」と区別されます。よって、この文字をWEBアプリの入力箇所にいれて、この文字をWEBブラウザが表示する時、想定しない表示になります。

世の中にあるWEBアプリは全てこの様なものなのか

それは違います。正しく対策をされている場合、この様なことは発生しません。対策を正しく実施している場合、XSS攻撃を回避できます。ですが、WEBアプリの製造者が正しく意識しないと対策できていません。なにも意識せずともセキュアなWEBアプリをつくれるのではありません。最近はマニュアル通り作ればセキュアなWEBアプリをつくれる様になってきてますが、「意識せずとも」までには至っていない様に思われます。

では、どの様な対策が必要なのでしょう?

対策1(究極の対策)
WEBアプリになにも、入力させない
→なにも、入力されなければ、XSS攻撃もできません。でも、入力を必要とするWEBアプリは
この対策はありえません。

対策2(保険的対策)
入力チェックで「表示、動作する情報」を入力させない。
→なんらかの方法で入力チェックをすり抜けて、入力された場合、XSS攻撃は成立します。よってこれは保険的な対策になります。

対策3(あるべき対策)
入力内容を表示する全ての箇所に「表示、動作する情報」を出力させない対策になります。
XSSはブラウザが「文字の情報」と認識してほしいところ「表示、動作する情報」として認識してしまうところにあります。よって、「文字の情報」に「表示、動作する情報」の文字が入力された場合でも、「文字の情報」としてしか認識されない様にすることで攻撃を回避できます。具体的には以下の様な文字変換です。
  「<」→「&lt;」
  「>」→「&gt;」
WEBブラウザは「<」を「文字の情報」として表示させたいのであれば「&lt;」にしてくれたらいいよと言う約束ごとがあります。これに変換することでXSSの対策が可能です。
※変換すべき文字はこれだけではありません。

まとめ

いかがでしょうか。大雑把でありますが、基本的な流れは押さえられていると思います。他にもいろいろと攻撃されることがあります。以下に参考になるサイトリンクを付けておきますので、セキュアなWEBアプリを構築するために理解を深めていただければと思います。
クロスサイト・スクリプティング
安全なウェブサイトの作り方

細かなことを言うと入力内容を出力する箇所により、変換すべき文字、方法が変わることを意識してください。
HTML特殊文字をエスケープ
JavaScript特殊文字をエスケープ
javascript のイベントハンドラの値をエスケープ
具体的なXSS対策(terasolunaの場合)