SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

プログラミング未経験から始めるPHP入門

セキュリティ対策をしてみよう!
プログラミング未経験から始めるPHP入門~応用編(5)

第12回 クロスサイトスクリプティングとSQLインジェクション


ダウンロード サンプルソース (4.2 KB)

セキュリティへの配慮は重要

 これまで、まずはPHPの基本的なプログラミングについて理解するために触れてきませんでしたが、Webアプリケーションを作成する際には、特にセキュリティ対策に気を使う必要があります。

 Webサイトを攻撃する手法は、「SQLインジェクション」「クロスサイトスクリプティング」「セッションハイジャック」などさまざまです。このような攻撃に対して、セキュリティ対策をしていないと次のような結果が起こり得ます。

  1. データベースに入っている個人情報がすべて盗まれてしまう
  2. データベースに入っている情報がすべて消されてしまう
  3. 他人になりすまし、商品が購入されてしまう
  4. 自分のサイトにアクセスしたユーザーが、他の悪意のあるサイトに誘導されてしまう
  5. Webサーバ自体がダウンしてしまう

 Webアプリケーションを作成する上では、こうした最悪の事態に備え、さまざまな攻撃を想定した対策を施す必要があります。例えば、データベースの情報が流出したことを考え、データベースに格納するパスワードを暗号化しておくのも対策の1つです。

 セキュリティの話題は多岐に渡りますが、今回は代表的な攻撃を2つ取り上げてみます。他人のサイトで攻撃を試さないよう、重々注意してください。また、より詳しく知りたい方は、「PHP セキュリティ」のキーワードで検索したり、最後に記載してある書籍などを参考に調べてみてください。

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

 Webサイトへの攻撃手法の1つとして、「クロスサイトスクリプティング」と呼ばれる攻撃があります。まずは現象を確認してみましょう。サンプルソース内の「STEP3」フォルダに、xss1.phpというファイルを用意したので、これをC:\xampp\htdocs\ecフォルダ以下にコピーし、http://localhost/ec/xss1.phpにアクセスしてください。

 アクセスした直後、URLがhttp://codezine.jp/に変わったはずです。

アクセスした直後のURL
アクセスした直後のURL

 次に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によって変換された箇所です。変換の対象となる記号の「<」「"」「>」などが、安全な文字列としてブラウザに読み込まれているのが分かります。

HTML形式に変換されたソース
HTML形式に変換されたソース

 サンプルソースの「STEP3」フォルダにhtmlspecialcharsによる対策を実施したプログラム(item_list.php、member.php)を置いたので、確認してください。

次のページ
SQLインジェクション

この記事は参考になりましたか?

プログラミング未経験から始めるPHP入門連載記事一覧

もっと読む

この記事の著者

大家 正登(オオイエ マサト)

デジタルハリウッド『PHP 講座』講師。学生時代、スペイン語を専攻していたものの何故かプログラム言語に心が傾き、近所のフリープログラマーに弟子入り修行。その後中堅 SIer に 3 年間所属し、現在はフリーエンジニア。仕事の傍らジャズを演奏し、コントラバス 2 台と同居中。(ITエンジニア・大家正登のWeb...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4347 2009/10/08 15:28

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー