PHPで指定時間内に指定回数以上のアクセスがあった場合に429エラーを表示させる方法
2026/08/05
ログインフォームやお問い合わせページに対して短期間に多数のアクセスがあり、それを何とかしたいというケースがあった。通常であれば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で指定したディレクトリ内のファイル名を取得し、更新日時順でJSON形式にて出力する方法
先日summernoteに対してギャラリー画像挿入機能を追加する方法をメモしたが ...
-
-
MySQLのバックアップファイルを簡単に作成できるライブラリ「myphp-backup」の利用方法
MySQLのバックアップを取る際にadminerとかから手動で対応するのではなく ...
-
-
PHPにて「hashids(Sqids)」ライブラリで数値からユニークなランダム英数字のIDに変換する方法
PHPにてユーザID等を推測されないよう数値のIDからユニークなランダム英数字の ...
-
-
PHPでCSVを簡単に取り扱える「LeagueCSV(thephpleague / csv)」の利用方法
PHPでCSVファイルの書き込みや読み込みを行う際、バニラPHPで対応していたが ...
-
-
mysqldumpが使えないレンタルサーバでMySQLのバックアップ
mysqldumpが使えないレンタルサーバで開発を行うことがあり、尚且つ他社に使 ...