Текущий код ограничения скорости на основе IP:
Код: Выделить всё
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;
}
В таких средах, как университеты или компании, несколько пользователей используют один и тот же общедоступный IP-адрес, поэтому законные пользователи блокируются, когда кто-то из той же сети превышает ограничение скорости.
Что мне нужно:
Я хочу реализовать ограничение скорости на основе сеанса, которое:
- Работает как для вошедших в систему, так и для пользователи, не вошедшие в систему
- Не требует аутентификации пользователя
- Использует файлы cookie сеанса или отпечатки браузера
Как я могу безопасно генерировать и отслеживать уникальные идентификаторы сеансов?
Любые примеры кода или лучшие практики будем очень признательны!
Подробнее здесь: https://stackoverflow.com/questions/798 ... ordpress-p
Мобильная версия