勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

PHPで指定時間内に指定回数以上のアクセスがあった場合に429エラーを表示させる方法

   2026/08/05  PHP

ログインフォームやお問い合わせページに対して短期間に多数のアクセスがあり、それを何とかしたいというケースがあった。通常であればreCAPTCHA / Cloudflare Turnstileあたりの導入を検討するが、色々制約があり今回はPHPのみで対応したかった。以下に対応方法をメモ。

 

やりたいこと

  • 〇分以内に〇回以上アクセスがあった場合に429エラー表示
  • PHPのみで実装したい(MySQL不可)

 

対応方法

ソースコード

制限時間とアクセス制限回数部分は適宜変更すること。

<?php
session_start();

//制限時間(10分)
$limit_time = 60 * 10;

//アクセス制限回数(10回)
$limit_count = 10;

//現在のタイムスタンプを取得
$now = time();

//セッションの保持状況を確認
$log = isset( $_SESSION['log'] ) ? $_SESSION['log'] : [];

//制限時間内のログをフィルタ
$filter = [];
foreach( $log as $val ){
    if( $val > $now - $limit_time ) $filter[] = $val;
}

//フィルタ後のログをセッションに保存
$_SESSION['log'] = $filter;

//セッション内のログの数がアクセス制限回数を超えた場合は429エラー(Too Many Requests)
if( count($_SESSION['log']) >= $limit_count ) {
    http_response_code(429);
    exit();
}

//今回の送信時刻を追加
$_SESSION['log'][] = $now;

//問題無い場合はその旨表示
echo 'アクセス成功';

 

リファレンス

http_response_code関数

https://www.php.net/manual/ja/function.http-response-code.php

429 Too Many Requestsについて

https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Status/429

 - PHP

  関連記事

CodeIgniter4でコントローラ実行の前後に指定したイベントを実行する方法
CodeIgniter4でコントローラ実行の前後に指定したイベントを実行する方法

CodeIgniter4で特定の条件の場合は指定したページにリダイレクトさせたい ...

CodeIgniter3でファイルキャッシュする方法
CodeIgniter3でファイルキャッシュする方法

CodeIgniterでファイルキャッシュが楽に導入できた。そこそこ使いそうなの ...

PHPでvar_dumpをツールバー形式で表示するライブラリ「Kint」の使い方
PHPでvar_dumpをツールバー形式で表示するライブラリ「Kint」の使い方

PHPでvar_dumpを見やすくするためにdBugライブラリを利用しているが、 ...

PHPにて特定の処理にかかった時間とメモリ使用量を測定する方法
PHPにて特定の処理にかかった時間とメモリ使用量を測定する方法

PHPにて特定の処理にかかった時間とメモリ使用量を測定したい。以下にソースコード ...

PHPにて指定した期間内のランダムな日付をn件生成し、日付順にソートした上で受け取る方法
PHPにて指定した期間内のランダムな日付をn件生成し、日付順にソートした上で受け取る方法

PHPにて指定した期間内のランダムな日付を指定した数だけ生成し、さらに日付順にソ ...