PHP開発者必見!最低限知っておくべきセキュリティ対策まとめ


PHP開発者必見!最低限知っておくべきセキュリティ対策まとめ

ウェブ・アプリケーション開発にとってPHP言語は大変便利なプログラミング言語ですが、一方で使い方を間違うと開発したwebサイトがいとも簡単にハッカーに乗っ取られてしまいます。

ハッキング被害に合わない・狙われないようにするためにも、PHP を使う上で知っておきたいセキュリティ対策をまとめておきます。

目次
  1. PHP開発者必見!最低限知っておくべきセキュリティ対策まとめ
  2. 実際にハッキングされる様子(XSS)
  3. クロスサイト・スクリプティング(XSS)
  4. SQLインジェクション
  5. ディレクトリ・トラバーサル
  6. OSコマンド・インジェクション
  7. クロスサイト・リクエストフォージェリ(CSRF)
  8. セッション・ハイジャック
  9. HTTPヘッダー・インジェクション
  10. メールヘッダー・インジェクション
  11. まとめ

image

PHP開発者必見!最低限知っておくべきセキュリティ対策まとめ

実際にハッキングされる様子(XSS)

ハッキングって非日常的でイメージがわきにくいと思います。そのためセキュリティー対策を安易に考え、怠るケースがあります。そこで、まずはどんな風にwebサイトが乗っ取られるか様子を見てみると、PHPセキュリティ対策の必要性を感じていただけると思います。

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

phpセキュリティ-xssクロスサイト・スクリプティング(XSS)の一例

XSSは、PHPを使ったwebアプリケーションの中でも特に気を付けたい脆弱要素になります。

クロスサイト・スクリプティングによる脆弱性が web サイトに存在すると、web ページが勝手に書き換えられたり、Cookie の情報が漏えいし、なりすましが行われるようになります。

対策

主に web ページ内の入力フォームに HTML や JavaScript のコードを入力して web サイトが改ざんされる手法になりますので、出力制限として URL を http:// か https://  で始まるもののみに制限したり、<script></script>要素を生成しないようにする方法があります。また、入力フォームに < や > が入力された場合、エスケープ処理されるように設定しておけば大丈夫です。
一般的に htmlspecialchars 関数を用いて対策が行われます。 サンプルコード

[code]

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>htmlspecialchars確認</title>
</head>
<body>
<?php
print (htmlspecialchars(' "<ダブル>" ',ENT_COMPAT,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" '<シングル>' ",ENT_COMPAT,'UTF-8').'<br>')."\n";
print (htmlspecialchars(' "<ダブル>" ',ENT_QUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" '<シングル>' ",ENT_QUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(' "<ダブル>" ',ENT_NOQUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" '<シングル>' ",ENT_NOQUOTES,'UTF-8').'<br>')."\n";
?>
</body>
</html>

[/code]

出力結果 php-xss

SQLインジェクション

phpセキュリティーSQLインジェクションSQLインジェクションのイメージ

SQLインジェクションは、webサイト開発者・管理者以外の人でもデータベースを操作できるようになることです。管理者以外でもデータベースにアクセスできるようになると、個人情報や重要情報の漏洩、データベースの改ざん、不正なログイン、サーバーの乗っ取りなどが発生する危険があります。

対策

外部から受け取った値をエスケープせずにSQLを実行するために起きる現象で、ユーザーから入力される文字列に関しては、可能な限りプレースホルダーを用いて対策します。
他には、データベースに関するエラーメッセージを表示しないように設定したり、データベースへのアクセス権限を見直すことが挙げられます。

ディレクトリ・トラバーサル

phpセキュリティーディレクトリ・トラバーサル ディレクトリ・トラバーサルのイメージ

一般公開していないファイルにアクセスされ、閲覧・改ざん・削除されてしまう脆弱要素です。

対策

外部から受け取った値をエスケープなしにファイル名を指定するために起こる現象なので、まずは外部からのファイル名要求を避けるように設定します。
外部からファイル名を要求する場合は、basename 関数を用いて、ファイル名からディレクトリ情報を取り除くように設定します。

OSコマンド・インジェクション

phpセキュリティーOSコマンドインジェクション OSコマンド・インジェクションのイメージ

サーバー上で意図しないOSコマンドが実行されて、間違ったアプリケーション処理が実行されます。自分のwebサイトが、他サイトへの攻撃の踏み台にされる可能性もある重大な脆弱性になります。

対策

外部から受け取った値をコマンドラインのパラメータに渡さない方法が、推奨されています。コマンドラインのパラメータに渡す場合は、escapeshellarg関数を利用して文字列をサニタイジングしてあげる方法があります。

クロスサイト・リクエストフォージェリ(CSRF)

phpセキュリティ-csrf クロスサイト・リクエストフォージェリ(CSRF)のイメージ

ログイン後にユーザーが行える投稿などの処理を、第三者によって勝手に行わせる危険があります。

対策

トークンを利用して正しいリクエストであるかどうかチェックする方法があります。HTML側に

[html]

//HTML側にトークンを埋め込む
<input name="token" type="hidden" value="&quot;&lt;?php" />"

[/html]

PHP側に、

[php]

//送られるトークンを検証する
if(session_id() !== @$_POST['token']){
}

[/php]

として検証する方法があります。

その他には、Referer が正しいリンク元かチェックすることでも CSRF の対策になりますし、重要な処理を実行する前にパスワードを求める方法も CSRF 対策として知られています。
CSRF の乗っ取りは、XSS にも似たような現象ですが内容が異なります。CSRF はサーバー側の処理を悪用され、XSS はブラウザ上の処理を悪用されます。

セッション・ハイジャック

phpセキュリティーセッションハイジャックセッション・ハイジャックのイメージ

セッション不備によって、ログイン後に利用者のみが利用できるサービスの悪用や個人情報の閲覧・改ざん・削除の危険があります。

対策

  • セッションIDをURLに含めないこと
  • ログイン時に既存のセッション情報を破棄し、新しいセッションIDを生成する

HTTPヘッダー・インジェクション

phpセキュリティ-HTTPヘッダーインジェクション HTTPヘッダー・インジェクションのイメージ

偽ページの表示や悪意あるスクリプトが実行され、ユーザーに不快感および被害を与える危険があります。

対策

  • リクエスト・ボディの値を、レスポンスヘッダの値へ送らない
  • リクエスト・ボディの値を、レスポンスヘッダの値へ送る場合はエスケープを実行する

メールヘッダー・インジェクション

phpセキュリティ-メールヘッダーインジェクション メールヘッダー・インジェクションのイメージ

問い合わせフォームなどのメール送信画面で、内容が改ざんされたり、迷惑メール・ウイルスメールの送信に悪用される危険があります。

対策

  • メールヘッダを固定値にして、メール本文のみを入力させる(外部からのパラメータをメールヘッダに含ませないようにする)
  • 入力値のすべての改行を削除する

Webサイト担当者としてのスキルが身に付く

無料カウンセリングはこちら

まとめ

いかがでしたでしょうか?これからPHPを使ってwebアプリを開発しようと思っている方にとってはネガティブ要因ばかりだったかもしれませんが、基本的にはパラメータをエスケープしたり、値の戻し方に注意すればwebサイトの脆弱性をクリアすることができます。

また開発したサイトのXSS をチェックできる web サービスも無料で公開されていますし(XSS-Scanner.com)、これを機に PHP のセキュリティーに目覚めた方は、Google から提供されている XSS ゲームで自分のセキュリティー力を試すことも面白いかもしれませんね。


オシママサラ
この記事を書いた人
オシママサラ
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp