I'm developing a WordPress plugin that provides chat functionality via REST API endpoints. Currently, I'm using IP-based rate limiting, but this causes issues in university/company environments where multiple users share the same public IP address behind a router.
Current IP-based rate limiting code:
private function get_client_ip() {
$ip_keys = [
'HTTP_X_REAL_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_CLIENT_IP',
'REMOTE_ADDR'
];
foreach ($ip_keys as $key) {
if (!empty($_SERVER[$key])) {
$ip = $_SERVER[$key];
if (strpos($ip, ',') !== false) {
$ips = explode(',', $ip);
$ip = trim($ips[0]);
}
if (filter_var($ip, FILTER_VALIDATE_IP)) {
return $ip;
}
}
}
return '0.0.0.0';
}
private function check_daily_limit($ip) {
$daily_limit = $this->rate_limits['daily'];
$limit_key = 'chat2find_daily_limit_' . md5($ip);
$data = get_transient($limit_key);
if ($data === false) {
$data = [
'count' => 1,
'first_request' => time(),
'ip' => $ip,
'endpoint' => 'daily'
];
set_transient($limit_key, $data, $daily_limit['seconds']);
} else {
if ($data['count'] >= $daily_limit['requests']) {
$wait_time = $daily_limit['seconds'] - (time() - $data['first_request']);
return new WP_Error('daily_rate_limit_exceeded',
sprintf('Daily API limit exceeded. Please try again in %d hours.', ceil($wait_time / 3600)),
['status' => 429]
);
}
$data['count']++;
set_transient($limit_key, $data, $daily_limit['seconds']);
}
return true;
}
The Problem:
In environments like universities or companies, multiple users share the same public IP, so legitimate users get blocked when someone else from the same network exceeds the rate limit.
What I Need:
I want to implement session-based rate limiting that:
Works for both logged-in and non-logged-in users
Doesn't require user authentication
Uses session cookies or browser fingerprints
My Question:
How can I generate and track unique session identifiers securely?