ウエブセキュリティ

ウエブアプリケーションを外部に公開する場合、本来そのサイトが持つ機能を逸脱した使われ方が行われる可能性があるサイトを脆弱性を持つサイト呼びます。脆弱性のあるサイトはセキュリティリスクが伴います。たとえ、サイトが個人情報などを保有しないサイトであっても、サーバ自体の侵入を許可したり、公開を意図しないサーバ内のファイルが漏洩されたりする可能性があります。また、知らない間に、サイトの内容が書き換えられ、他のサイトを攻撃する踏み台サーバとして書き換えられたりすることもあります。ウエブサイトを公開する場合はそのサイトの内容に問わず、セキュリティを意識したプログラムを開発することが求められます。
以下では、ウエブアプリケーションにおける、脆弱性の代表例を解説します

XSS (クロスサイトスクリプティング)

XSSとは、ユーザが入力した文字列が直接HTMLで出力されてしまう箇所があった場合、その入力値がJavaScriptの実行コードとして動作してしまう脆弱性のことです。よく発生するケースとして

  • 掲示板などの書き込み型サービス
  • 検索結果の画面で、「○○で検索した結果」と表示する部分
  • 申し込みフォームなどの確認画面

などは要注意です。
JavaScriptが実行されるとどのようなリスクが発生するかを例を用いて解説します。

  1. ある別の悪意のあるサイトが脆弱性をもつサイトへのリンクをJavaScriptが実行される引数をもって貼付けます
  2. ユーザがそのリンクをクリックした場合、脆弱性のあるサイトへ遷移します。遷移時に脆弱性のあるサイトでJavaScriptが実行されます。
  3. JavaScriptには脆弱性のあるサイトのCookieを取得し別のサーバへ転送する仕掛けが組み込まれています。(CookieについてはWebの基本を参照)
  4. 悪意のあるユーザが、そのサイトをでCookieの送信を受信することで、脆弱性を持つサイトへ被害者のCookieを用いて(なりすまして)アクセスすることが可能になります。

XSSを防止する第一歩は、ユーザが入力した文字列の画面出力時にはHTMLをエスケープすることを徹底することです。

SQLインジェクション

Databaseを利用するアプリケーションでwhere句での条件値をユーザの入力値をそのまま利用した場合にSQLインジェクションと呼ばれる脆弱性が発生する可能性があります。例えば、ユーザ認証であるユーザのパスワードが一致している場合にログイン可能とする処理で

SELECT * FROM user_table WHERE user=[入力されたユーザ値] AND passwd=[入力されたパスワード値] 

とした場合 入力されたパスワードが

適当な文字列 OR 1=1

であった場合

SELECT * FROM user_table WHERE user=[入力されたユーザ値] AND passwd=適当な文字列 OR 1=1

となり、意図しない結果になると思います。(場合によってはログイン成功と処理されるでしょう)。またDBの中身が意図しない形で画面に出力される可能性もコーディングによってはあります。
対策としては、SQLを実行する際は prepared statementを用いたり、入力値をチェック(エスケープ)したりの処理が必要です

CSRF(クロスサイトリクエストフォージェリ)

CSRFとは、サービスの利用を中断してもCookie等を用いてログイン状態を一定期間保つ機能をもつサイトに対して、被害を受ける可能性がある脆弱性です。悪意のあるサイトにアクセスした際に、そのHTML内に脆弱性のあるサイトでの処理内容を自動的に実行するコードが埋め込まれ、意図してない処理を被害ユーザが行ってしまうことをさせます。意図せず行わせる被害ケースとしては掲示板への自動書き込み、パスワードの変更処理など多岐に及びます。
これを防ぐ手段としては、ユーザに重要な操作を行わせる際には、確認画面を経由させ、更新処理時にその画面からの遷移であるかを確認する仕組みをもうけることや、CAPTCHAなどの認証キーを求めることがあげられます。リファラを利用することは対策としては不十分です。


Webアプリケーションを作る前に知るべき10の脆弱性(@IT)
PHPでのセキュリティ施策についてのメモ