header

PHPとクロスサイトスクリプティング対策

(1/2)

ユーザーからの入力を許しているページ(アンケート調査、懸賞応募、掲示板、メール送信、等々)では、悪意のある人物によって重要な情報を盗まれたり、最悪の場合、サイト自体を破壊されることがあります。このとき使われる手法がクロスサイトスクリプティング(XSS)である。
今回は、代表的なXSSの手法を紹介し、後半で対策を説明する。

懸賞応募ページなどユーザーからの情報入力が行われるページの流れは――最初のページで情報を入力し[確認]ボタンを押すと、次のページに入力内容の確認が行われる。ここで[送信]ボタンを押すと、情報がデータベースに登録される――というものが多い。
ここで問題となるのが、2番目の確認画面である。

まず、次のPHPプログラムを見てほしい。IDとニックネームを入力させ、“ようこそ”メッセージを表示する何の変哲もないプログラムである。

0001: <?php
0002: // ここからPHPプログラム =======================================================
0003: /** xss2.php
0004:  * 脆弱な入力画面
0005:  * @copyright   (c)studio pahoo
0006:  * @author      パパぱふぅ
0007:  * @version     1.0  2005/08/19
0008:  *
0009: */
0010: //初回起動時
0011: if (isset($_GET["NAME"]) == FALSE) {
0012: $myself = basename($_SERVER["PHP_SELF"]);
0013: setcookie("DUMMYID", "ダミー・データです");
0014: 
0015: // ここまでPHPプログラム =======================================================
0016: ?>
0017: 
0018: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
0019:  "http://www.w3.org/TR/html4/loose.dtd">
0020: <html lang="ja">
0021: <head>
0022: <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
0023: <title>脆弱な入力画面</title>
0024: </head>
0025: <body>
0026: 
0027: <h3>■IDとニックネームを入力してください</h3>
0028: <form method="get" action="<?= $myself ?>">
0029: <table border="0" cellpadding="4">
0030: <tr>
0031: <td>ID</td>
0032: <td><input type="text"   name="ID" size="80" /></td>
0033: </tr>
0034: <tr>
0035: <td>ニックネーム</td>
0036: <td><input type="text"   name="NAME" size="80" /></td>
0037: </tr>
0038: <tr>
0039: <td colspan="2"><input type="submit" name="SUBMIT" value="送信" /></td>
0040: </tr>
0041: </table>
0042: </form>
0043: </body>
0044: </html>
0045: 
0046: <?php
0047: // ここからPHPプログラム =======================================================
0048: } else {
0049: echo stripslashes($_GET["NAME"]) . " さん、いらっしゃい";
0050: }
0051: // ここまでPHPプログラム =======================================================
0052: ?>
0053: 

プログラムを実行する

ところが、ニックネームに http://www.pahoo.org/e-soul/webtech/php02/program/xss2.php?NAME=" + document.cookie); と入力してみてほしい。CookieをONにしている方は、いきなりCookieの内容が表示されたはずだ。