セキュリティへの配慮は重要
これまで、まずはPHPの基本的なプログラミングについて理解するために触れてきませんでしたが、Webアプリケーションを作成する際には、特にセキュリティ対策に気を使う必要があります。
Webサイトを攻撃する手法は、「SQLインジェクション」「クロスサイトスクリプティング」「セッションハイジャック」などさまざまです。このような攻撃に対して、セキュリティ対策をしていないと次のような結果が起こり得ます。
- データベースに入っている個人情報がすべて盗まれてしまう
- データベースに入っている情報がすべて消されてしまう
- 他人になりすまし、商品が購入されてしまう
- 自分のサイトにアクセスしたユーザーが、他の悪意のあるサイトに誘導されてしまう
- Webサーバ自体がダウンしてしまう
Webアプリケーションを作成する上では、こうした最悪の事態に備え、さまざまな攻撃を想定した対策を施す必要があります。例えば、データベースの情報が流出したことを考え、データベースに格納するパスワードを暗号化しておくのも対策の1つです。
セキュリティの話題は多岐に渡りますが、今回は代表的な攻撃を2つ取り上げてみます。他人のサイトで攻撃を試さないよう、重々注意してください。また、より詳しく知りたい方は、「PHP セキュリティ」のキーワードで検索したり、最後に記載してある書籍などを参考に調べてみてください。
クロスサイトスクリプティング(XSS)
Webサイトへの攻撃手法の1つとして、「クロスサイトスクリプティング」と呼ばれる攻撃があります。まずは現象を確認してみましょう。サンプルソース内の「STEP3」フォルダに、xss1.phpというファイルを用意したので、これをC:\xampp\htdocs\ecフォルダ以下にコピーし、http://localhost/ec/xss1.phpにアクセスしてください。
アクセスした直後、URLがhttp://codezine.jp/に変わったはずです。
次にxss1.phpをメモ帳などで開き、プログラムを確認してみてください。
$str = '<meta http-equiv="Refresh" content="1;URL=http://codezine.jp/">';
print($str);
このプログラムは単純に変数の中身を表示しているだけですが、変数の中身に記述されている
<meta http-equiv="Refresh" content="1;URL=http://codezine.jp/">
という自動的に画面を遷移させるHTMLタグが、そのまま出力されており、ブラウザがこのHTMLタグを素直に解釈して実行しています。もしも、これが掲示板サイトのプログラムだったらどうなるでしょうか。悪意のあるユーザーが、悪意のあるサイトを見せるために
<meta http-equiv="Refresh" content="1;URL=http://[悪意のあるサイトURL]/">
と掲示板に書き込みをするかもしれません。このようなHTMLの他にもブラウザ上で動作するJavaScriptというプログラム言語があり、これを書き 込むことで、さらに不正な動作をさせることができます。例えば、サイトにログインしているユーザーのログイン情報を盗む、というようなことです。このような攻撃をクロスサイトスクリプティング(略してXSS)と呼びます。
クロスサイトスクリプティングへの対策
この攻撃への対策として、変数の中身を表示する際にhtmlspecialcharsという命令を組み合わせて使います。
print( htmlspecialchars( $str, ENT_QUOTES ) );
htmlspecialchars命令は、例えばブログに読者がコメントを付けられるなどといったユーザーからの入力を受け付けるような仕組みのページを作る場合、「<」や「>」などブラウザがHTMLとして解釈する記号を安全に表示するための命令です。
上記のコードは、$strという変数をhtmlspecialcharsを用いて安全に表示できるようにした上で、print命令を用い、画面に出力しています。変換対象の文字など、より詳しい説明がこちらのサイト(htmlspecialchars:そふぃのPHP入門)などに記載されていますので、参照ください。
それでは、htmlspecialcharsによる対策済のプログラムで試してみましょう。先ほどと同じ手順で、xss2.phpをコピーし、http://localhost/ec/xss2.phpにアクセスしてください。
今回は、ページを移動することなく、変数の中身がそのまま表示されました。
このページのソースコードは、次のようになっています。赤枠内の部分が、htmlspecialcharsによって変換された箇所です。変換の対象となる記号の「<」「"」「>」などが、安全な文字列としてブラウザに読み込まれているのが分かります。
サンプルソースの「STEP3」フォルダにhtmlspecialcharsによる対策を実施したプログラム(item_list.php、member.php)を置いたので、確認してください。



