2-1 基本事項 [PHPセキュリティー]
セキュリティーを考える
- リスクと利便性のバランス
ウェブアプリケーションの投稿フォームに網膜スキャンや指紋認証が必要で、複雑な投稿作業で何十分も時間が掛かるとすれば、ユーザーは面倒で投稿しなくなるでしょう。セキュリティーレベルは上がるかもしれませんが。セキュリティーはアプリケーションの利便性とのバランスが必要です。完全に安全なシステムというものは理想でしかないようです。ユーザーの作業を達成させつつ、セキュリティーを維持する必要があります。
本サイトでは、「PHPコードを記述する上で何が危険であるか」を考えていきたいと思います。その上で、一般的に認知度が高いウェブアプリケーションへの攻撃とその防御策を紹介したいと思います。
セキュリティーで大切なこと
- データの追跡
セキュリティーで最も重要なことの一つは、「データを常に追跡し続ける」ということです。そのデータが、どのようなデータなのか、何処にあるのか、何処から来て何処へ行くのか、それらを常に意識して考えるということです。
アプリケーションのどこからデータが入力されるのか、アプリケーションのどこにデータが存在するのか、アプリケーションからどこへデータを送信するのか、を考えましょう。例えば、$_POST や $_GET は、PHPにとってhttpクライアントからデータを受信するということです。「echo」「print」を使用した場合は、PHPからデータをhttpクライアント(ブラウザなど)へ送信していることになります。「mysql_query()」を使用した場合は、PHPからデータをMySQLデータベースへ送信しているということになります。
このように、どこからPHPへデータが受信(入力)され、PHPからどこへデータを送信(出力)するのか、データの追跡を常に考えるようにしましょう。
ウェブアプリケーションにおける基本的なセキュリティー事項
- 最新情報の取得
- 最新バージョンの使用
- robots.txtの設置
(非公開のディレクトリに対してロボットのクロールを制限する) - ドキュメントルート以下にパスワード等が記述された設定ファイルや重要ファイルを置かない
(ドキュメントルートはブラウザで閲覧できるディレクトリ) - 各ディレクトリにindex.htmlを設置し、ディレクトリのファイル内容が閲覧できないようにする
(ウェブサーバーで閲覧不可の設定可能) - アクセス制限のあるディレクトリにはベーシック認証等を設置する
- IPによるアクセス制御を行う
- ウェブアプリケーションのパスワードや機密情報はデータベースに格納する
- ウェブサイトの入力フォームにはSSLを導入する
- アクセスログを取得する(サーバーでの詳細ログ)
- ファイル転送などの際のサーバーへの接続はSFTPなどの暗号化された通信を行う
- ローカルPCにはウィルスソフトを導入する
- パスワードの管理を徹底する
- WAF(Web Application Firewall)Webアプリケーションファイアウォールの導入
Webアプリケーションのやり取りを管理し、不正浸入を防ぐファイヤーウォール - IDS(Intrusion Detection System)浸入探知システムの導入
ネットワーク上の不正侵入を探知し、ネットワーク管理者に通報する - IPS(Intrusion Prevention System)浸入防御システムの導入
サーバーやネットワークへの不正侵入を探知するだけでなく防ぐ
PHPコード記述における基本的なセキュリティー事項
- PHPエラーコードを確認する
- PHPエラーコードを公開しない
- データの追跡
- 変数の初期化
- データのフィルタ
- データのエスケープ
- 多重防御(冗長的な防御対策)
- 最小権限(不要な権限は与えない)
- 最小データ(不要なデータを読み出さない)
- 非推奨のPHPディレクティブを使用しない
- 非推奨のPHP関数を使用しない
- 危険な関数やディレクティブを使用する場合は注意する
セキュリティーにおいての主な問題
- セマンティックURL攻撃
- クロスサイトスクリプト攻撃(XSS)
- クロスサイトリクエストフォージェリ(CSRF)
- SQL インジェクション
- セッションハイジャック
- パス・トラバーサル(ディレクトリ・トラバーサル)
- バックドアURL
- コマンドインジェクション
本サイトでは上記の攻撃方法やその防御策を紹介しています。参考にしてみて下さい。
フィルタリングとエスケープ
適切なPHPディレクティブの構成(php.ini)
- PHP構成ディレクティブ(php.ini)を見直す
ディレクティブとは指示文のようなものです。PHPのディレクティブは、php.iniにその内容が記述されています。PHP構成ディレクティブ(php.ini)ではPHPのコア設定が出来ます。また、php-gd php-mbstring php-mysqlなどといったPHP拡張モジュールのディレクティブもphp.iniに記述されています。現状どのような設定になっているのか見直してみましょう。本サイトではセキュリティーを考慮した設定を紹介していますので参考にしてみて下さい。詳細はこちら。
PHPの危険な関数
- 使用に注意が必要な関数がある
PHPでは非常に多くの予め用意された組み込み関数があります。これらの関数の中には使用に注意が必要な関数があります。誤った使用方法によりアプリケーションの脆弱性が発生します。本サイトではこのような使用上注意すべき関数を紹介していますので、参考にしてみて下さい。詳細はこちら。
タグ(=記事関連ワード)
日付
最終更新日: