PHPとは
PHPは、Web開発で広く使われるサーバー側スクリプト言語で、HTML生成やAPI処理などを行えます。一般に「ピー・エイチ・ピー」と読み、現在の正式な展開は再帰的頭字語のPHP: Hypertext Preprocessor(ピー・エイチ・ピー:ハイパーテキスト・プリプロセッサー)です。
PHPコードはサーバーで実行され、生成したHTML、JSON、画像、リダイレクトなどの結果がWebサーバーからクライアントへ返ります。通常、ブラウザーへPHPソースそのものを渡しません。
PHPはHTMLの一種ではなく、HTMLを生成できるprogramming言語です。JavaScriptが主にブラウザーで動くのに対し、PHPはサーバー側で要求を処理します。

一回のWeb要求で動く範囲
Webサーバーがモジュール、CGI、FastCGIなど設定されたSAPIを通してスクリプトを指定する。
設定、autoload、ライブラリー、環境変数、エラー処理ハンドラーなどを読み込む。
方式、問い合わせ、フォーム、JSON、Cookie、ファイルアップロードを種類と上限を確認して読む。
認証・認可、検証、データベース、外部API、テンプレートを必要な順に処理する。
状態、ヘッダー、Cookie、HTML・JSONなどの本文を生成して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 Considerations、FastCGI Process Manager、PHP Supported Versions、Built-in Web Server