PHP によるログ記録 API の仕組みと実装解説

本記事では,PHP で記述されたログ記録 API の処理内容を技術的観点から解説する。本 API は,クライアントから送信される JSON データを受信し,データベースへ安全に記録する役割を担う。

主な処理は,CORS 設定,POST データの検証,プリペアドステートメントによる SQL 実行,JSON 応答の返却で構成される。

CORS 設定

外部オリジンから API を呼び出す場合,ブラウザは CORS (Cross-Origin Resource Sharing) 制限を適用する。

本 API では,以下のヘッダを付与することで,特定オリジンからのアクセスのみを許可している。

  • Access-Control-Allow-Origin:許可するオリジンを限定する。
  • Access-Control-Allow-Methods:POST,GET,OPTIONS を許可する。
  • Access-Control-Allow-Headers:Content-Type を許可する。
  • Access-Control-Allow-Credentials:認証情報の送信を許可する。

ブラウザは本リクエスト前に OPTIONS(プリフライト)を送信するため,OPTIONS リクエストの場合は即終了している。

(参考)CROS 制限の概要

CORS(Cross-Origin Resource Sharing)とは,Web ブラウザが実装しているオリジン間アクセス制御の仕組みである。

オリジンとは,プロトコル(http/https)ドメインポート番号の組み合わせであり,これらが異なる場合は「別オリジン」とみなされる。

ブラウザはセキュリティ上の理由から,別オリジンへのリクエストに対してアクセス制限(Same-Origin Policy)を適用する。

この制限を緩和し,安全に外部オリジンへアクセスするための仕組みが CORS である。

POST データの受信と検証

JSON データの取得

php://input から生の POST ボディを読み取り,json_decode により連想配列へ変換する。

これにより,クライアント側の fetch API や XMLHttpRequest から送信された JSON を確実に取得できる。

データ形式チェック

受信したデータが配列でない場合,HTTP 400 を返して処理を終了する。

このチェックにより,不正なデータ形式や攻撃的な入力を早期に排除できる。

データ抽出とデフォルト値

受信した JSON から必要な項目を抽出し,欠損時にはデフォルト値を設定する。

これにより,クライアント実装の差異やデータ欠損に対する堅牢性が向上する。

  • $timestamp:サーバ側で生成する記録時刻。
  • $action:ユーザ操作の種類。
  • $url:操作が行われたページ。
  • $questionID:問題番号など。
  • $userAnswer:ユーザ回答。
  • $correctAnswer:正答。
  • $appName:アプリ名。
  • $appVersion:アプリバージョン。

SQL クエリの準備と実行

本 API は $conn->prepare() を用いてプリペアドステートメントを生成している。

これは,SQL インジェクション対策として極めて重要である。

bind_param("ssssiiss", ...) の型指定は以下の意味である。

  • s:string
  • i:integer

型の並びはテーブル kouji2 のカラム順に対応している。

クエリ実行と応答生成

$stmt->execute() の結果に応じて,成功時は {"status":"success"} を返し,失敗時は HTTP 500 とともにエラーメッセージを返す。これにより,クライアント側は API の成否を確実に判定できる。

ステートメントと接続の終了処理

処理終了後,ステートメントとデータベース接続を確実に閉じることで,リソースリークを防止している。

最後に Content-Type: application/json を付与して JSON 応答を返却する。

本 API の評価と改善案

  • CORS 設定が適切であり,特定オリジンのみ許可している点は安全性が高い。
  • プリペアドステートメントを使用しており,SQL インジェクション対策が施されている。
  • データ欠損に対してデフォルト値を設定しており,堅牢性が高い。
  • HTTP ステータスコードを適切に返しており,API としての品質が良い。

改善の余地

  • 例外処理(try-catch)を導入することで,エラー時の情報をより詳細に取得できる。
  • 入力値の追加バリデーション(数値チェック,文字列長チェックなど)を行うと安全性が向上する。
  • 必要に応じて CSRF (Cross-Site Request Forgery) 対策を導入する。

PHP によるログ記録 API の仕組みと実装解説” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です