Как реализовать ограничение скорости на основе сеанса вместо ограничения по IP для плагина WordPress?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как реализовать ограничение скорости на основе сеанса вместо ограничения по IP для плагина WordPress?

Сообщение Anonymous »

Я разрабатываю плагин WordPress, который обеспечивает функциональность чата через конечные точки REST API. В настоящее время я использую ограничение скорости на основе IP, но это вызывает проблемы в университетских или корпоративных средах, где несколько пользователей используют один и тот же общедоступный IP-адрес за маршрутизатором.
Текущий код ограничения скорости на основе 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»