10週間ウェブ開発講座

第五週

XSS

前週でXSSについて軽く触れました。
今週はXSSを実行させないための工夫について説明します。

XSS対策の基本は、HTMLとして特殊な意味を持つ文字*1のエスケープ*2です。
HTMLとして特殊な意味を持つ文字には次のようなものがあります。

メタ文字エスケープ後の表現(&は半角に直す)
''
""
&&
<&lt;
>&gt;

本講座ではこれ以上は言及しませんが、これらの文字のエスケープのみでは不十分な場合があります。
問題となるケースをいくつか紹介します。

  • cssやscriptタグの中身を動的に生成する場合
  • ブラウザに文字コードを明示していない場合
  • HTMLの属性を共通の引用符('や")でくくっていない場合

これらについて興味があれば、「徳丸浩の日記 - XSS - 今こそXSS対策についてまとめよう」などを参照してください
(ページ中に含まれる「XSS対策としてのエスケープが本質だがバリエーションが多い」の1. - 8. までのリンクも併せて読んでみてください)。

なお、phpではhtmlspecialcharsという関数があり、これで上記のメタ文字をエスケープすることができます。
次のphpプログラムの出力を確かめてみてください。

  1. <?php
  2. $js_code = '<script type="text/javascript">alert("alert!!");</script>';
  3. echo htmlspecialchars($js_code, ENT_QUOTES, 'UTF-8'));
  4. ?>

htmlspecialcharsは複数の引数を取ることができます。第一引数のみ必須です。

  • 第一引数(例では$js_code): エスケープ処理したい文字列
  • 第二引数(例ではENT_QUOTES): クオート文字の処理方法の指定(通常はENT_QUOTES)
  • 第三引数(例では'UTF-8'): エスケープ処理したい文字列のエンコーディング

その他のセキュリティ対策

本講座で作成するアプリケーションは、「非ログイン状態」かつ「個人情報を扱わない」ので、セキュリティ対策としてXSSのみを扱いました*3
セキュリティに関してウェブアプリケーション作成者が知らなければならないことは膨大であり、その多くは難解ではないものの、
「対策漏れ」を生み出してしまうことは多々あります。

参考資料などを読み、セキュリティに関する基本的知識を押さえると同時に、セキュリティに関するニュースを追うことが重要です。

宿題

  • 名前
  • 身長
  • 体重

をフォームから入力させ、フォームを送信した先のページで次の情報を出力するものを作成してください。

  • 名前
  • 身長
  • 体重
  • BMI
  • 体型判定

作成するときには(XSSを含む)不正な入力をチェックする仕組みを盛り込んでください。

なお、BMIは次の式で求まります*4

体重(kg)/(身長(m) * 身長(m))

体型判定は次の条件で行ってください。

BMI判定
18.5未満やせ型
18.5以上かつ25.0未満標準体型
25.0以上肥満型

実装のサンプルは次のurlです。

実装完了したファイルは、次の場所に置いてください("y-mahata"は自分のIDに置き換えてください)。

参考資料


*1 特殊文字、もしくはメタ文字と呼ばれます。
*2 ここでは「問題のある文字(列)」を「問題のない文字(列)に置き換えることをエスケープと呼びます。
*3 ただし、データベースの話をするときに「SQLインジェクション」対策について扱います。
*4 身長の単位がm(= メートル)であることに注意してください

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-05 (金) 09:58:32 (212d)