用語辞典・サーバー・Web運営

PHP

PHPとは

PHPは、Web開発で広く使われるサーバー側スクリプト言語で、HTML生成やAPI処理などを行えます。一般に「ピー・エイチ・ピー」と読み、現在の正式な展開は再帰的頭字語のPHP: Hypertext Preprocessor(ピー・エイチ・ピー:ハイパーテキスト・プリプロセッサー)です。

PHPコードはサーバーで実行され、生成したHTML、JSON、画像、リダイレクトなどの結果がWebサーバーからクライアントへ返ります。通常、ブラウザーへPHPソースそのものを渡しません。

PHPはHTMLの一種ではなく、HTMLを生成できるprogramming言語です。JavaScriptが主にブラウザーで動くのに対し、PHPはサーバー側で要求を処理します。

WebサーバーがPHPスクリプトを実行系へ渡し、入力・セッション・データベースから応答データを生成するソースはサーバー内に残し、生成結果だけをブラウザーへ返す
ブラウザー要求をWebサーバーがPHP実行工房へ渡し、スクリプトが認証情報、セッション、データベースを使ってHTML文書とデータ応答を生成し、ソースを施錠したまま結果だけ返すPHPのピクトグラム図解
図1PHPで生成したHTMLを受け取った後は、ブラウザーが通常のHTML・CSS・JavaScriptとして表示します。

一回のWeb要求で動く範囲

要求ごとの入力準備から、アプリケーション処理、応答生成、終了処理までを分ける前の要求のメモリーへ暗黙に頼らず、必要な状態は明示的に保存する
DispatchPHPへ処理を渡す

Webサーバーがモジュール、CGI、FastCGIなど設定されたSAPIを通してスクリプトを指定する。

Bootstrap実行環境を準備する

設定、autoload、ライブラリー、環境変数、エラー処理ハンドラーなどを読み込む。

Input要求を受け取る

方式、問い合わせ、フォーム、JSON、Cookie、ファイルアップロードを種類と上限を確認して読む。

Application業務処理を行う

認証・認可、検証、データベース、外部API、テンプレートを必要な順に処理する。

OutputHTTP応答を作る

状態、ヘッダー、Cookie、HTML・JSONなどの本文を生成してWebサーバーへ渡す。

Finish資源を片付ける

トランザクション、ファイルハンドル、ログ、セッションロックを完了し、要求の実行を終える。

図2長時間処理を要求内で待たせると、PHPワーカーとWeb接続を占有します。待ち行列と背景ワーカーへ分ける設計も使います。

SAPIがWebサーバーとPHPを結ぶ

SAPI(Server Application Programming Interface/サーバー・アプリケーション・プログラミング・インターフェース)は、PHP実行系がWebサーバーやコマンド行などの環境と接続する境界です。

Apacheモジュールとして処理内で動かす方式、要求ごとに処理を起動するCGI、常駐処理へ渡すFastCGIがあります。PHP-FPM(FastCGI Process Manager/ファストシージーアイ・プロセス・マネージャー)はFastCGIワーカープールを管理し、ApacheやNginxから要求を受けます。

.phpを直接開いても実行されない

ローカルの.phpファイルをブラウザーで直接開くと、WebサーバーとPHP SAPIを通らないためプログラムとして実行されません。公開サーバーでも処理ハンドラー設定が外れると、ソースを平文テキストで返す重大事故になる可能性があります。

開発時はPHPのbuilt-in Webサーバーを使えますが、公式手動は公開ネットワーク向けのfull-featuredサーバーではないと警告しています。本番では適切なWebサーバーまたはプラットフォームを使います。

入力は型・長さ・許可範囲を検証する

問い合わせ文字列、フォーム、JSON、Cookie、ヘッダー、アップロードファイルはすべて外部入力です。存在すること、期待する型へ変換できること、長さ・範囲・列挙値を満たすことを検証します。表示上の必須やJavaScript検証だけでは、直接HTTP要求を送る相手を止められません。

検証は「処理可能か」の判定、sanitizationは用途に合わせて整える処理です。HTML、SQL、シェル、URL、ヘッダーでは安全な表現が異なるため、一つの置換関数をすべてへ使い回しません。

出力先に応じてエスケープする

HTML本文へ文字列を出すときはHTML用エスケープ、HTML属性やJavaScript リテラル、URLへ埋め込むときはそれぞれの文脈へ合う方法を使います。保存時に一律エスケープすると、別文脈で二重化や不足が起こります。

テンプレートエンジンの自動エスケープを既定にし、生HTMLを許す機能を限定します。Content-Typeと文字集合を明示し、JSONはエンコーダーで生成します。

データベースには準備済み文で値を渡す

データベースへ文字列を連結してSQLを作ると、入力が命令へ変わるSQL注入が起こります。PDOやデータベース拡張の準備済み文で、SQL構造と値を分けます。

接続アカウントには必要なスキーマ・操作だけを許可し、パスワードをソースリポジトリや公開ディレクトリーへ置きません。トランザクションを短くし、失敗時は切り戻しし、利用者へ内部SQLや接続情報を表示しません。

セッションIDとセッションデータは別

PHPセッションでは、ブラウザーのCookieへセッションIDを持たせ、データ本体をサーバー側のファイルやデータベースなどへ保存する構成が一般的です。Cookieへパスワードや全プロファイルをそのまま保存する意味ではありません。

HTTPS、Secure、HttpOnly、SameSite、ID再生成、期限、ログアウト時の破棄を設定します。複数PHPワーカーや複数サーバーで使う場合は、全ワーカーから一貫して参照できるセッション保存とロックを設計します。

アップロードは保存名と実行権限を分ける

ブラウザーが送るファイル名とContent-Typeを信用せず、大きさ、実体、許可形式を検査します。サーバー側で衝突しない名前を作り、文書ルート外またはスクリプト実行を禁止したディレクトリーへ保存します。

画像変換やウイルス検査もリソース上限と隔離を設けます。アップロード後のURLへ認可が必要なら、Webサーバーから直接公開せず、アプリケーションが権限確認後に配信します。

エラーを画面へ出さずログへ残す

開発環境ではエラー表示が役立ちますが、本番でスタックトレース、ファイルパス、環境、SQLを表示すると内部情報が漏れます。利用者には一般的なエラーと追跡IDを返し、詳細は保護したログへ記録します。

PHP分岐にはアクティブサポート、セキュリティfixes only、end of lifeの期間があります。公式対応する versionsを確認し、OS・ホスティング事業者が提供するビルドの更新経路に従います。アプリケーションと拡張の互換性を検証して更新します。

PHPの安全性は言語名ではなく、入力の検証、文脈別出力、データベース権限、セッション、アップロード、エラー表示、対応するバージョンを一つの要求経路として管理できるかで決まります。

PHPの確認資料:PHP Manual「What is PHP?」General Installation ConsiderationsFastCGI Process ManagerPHP Supported VersionsBuilt-in Web Server

関連用語