Банки кукі PHP cURL для окремих сеансів користувачів
Проєктування збереження кукі PHP cURL навколо віддаленого сеансу: довірені імена файлів, явне збереження та паралельні запити.
PHP-застосунок обслуговує Alice і Bob, і обидва використовують його серверний клієнт cURL, щоб через проксі потрапити на той самий віддалений сайт. Якщо кожен запит завантажує cookies.txt, двоє користувачів можуть успадкувати той самий віддалений вхід. Зміна їхніх проксі-адрес не розділяє цей файл.
Виберіть власника кукі перш ніж вибирати ім'я файлу. Зазвичай це логічний віддалений сеанс застосунку: локальний користувач, певний віддалений обліковий запис і, за потреби, окремий робочий простір. Кінцева точка проксі — це вибір маршруту, а не надійний ідентифікатор сеансу. Кілька користувачів можуть ділити одну кінцеву точку, а кінцева точка може змінювати виходи.
Завантажуйте і зберігайте банку того самого сеансу
Дозвольте застосунку зіставити свій автентифікований сеанс із ключем файлу, створеним сервером. Із приватним каталогом кукі та довіреним $sessionKey конфігурація cURL має такий вигляд:
$jar = $cookieDirectory . '/' . $sessionKey . '.cookies';
$ch = curl_init('https://service.example.net/account');
curl_setopt_array($ch, [
CURLOPT_PROXY => 'http://proxy.example.net:8080',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEFILE => $jar,
CURLOPT_COOKIEJAR => $jar,
]);
Для дозволеного тесту сеансу публічного сайту в мережі, що допускає публічного посередника, список HTTP-проксі надає кандидатні кінцеві точки. Використовуйте дескриптор без налаштованої автентифікації проксі або збережених облікових даних проксі та тримайте стан кукі закріпленим за потрібним сеансом. Цей фрагмент налаштовує дескриптор; застосунок виконує передавання і перевіряє результат через звичайний потік запитів. COOKIEFILE завантажує попередні кукі сеансу. COOKIEJAR вибирає, куди дескриптор записує збережені кукі. Встановлення лише вихідного файлу не завантажує попередній вхід.
Новий сеанс може початися без файлу. Дайте його першому передаванню потрібний шлях банки, дозвольте сайту встановити кукі та збережіть отриманий стан для наступного запиту. Каталог кукі має бути доступним для запису працівникові застосунку й перебувати поза публічно обслуговуваним деревом документів. Не перетворюйте ім'я користувача чи шлях, надані відвідувачем, на ім'я файлу; шукайте довірений ключ на сервері.
Збереженню потрібне місце в життєвому циклі запиту
libcurl зазвичай записує банку під час очищення дескриптора. Якщо застосунку потрібна явна точка збереження після віддаленого обміну, він може запитати:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Це записує кукі, відомі дескриптору наразі, до його налаштованої банки. Завершіть використання дескриптора для цього сеансу, перш ніж призначати його не пов'язаній роботі. Зміна лише шляху банки в дескрипторі, який уже містить кукі Alice, не дорівнює створенню чистого сеансу Bob.
Також відрізняйте успішне завантаження від успішного збереження. Документація банки кукі зазначає, що помилка запису під час очищення не повертається як звичайна помилка передавання. Перевіряйте власника каталогу, дозволи та діагностичний вивід застосунку, коли вхід працює для одного запиту й зникає на наступному.
Паралельні запити вводять ще одну межу. Двоє працівників можуть завантажити ту саму стару банку, незалежно змінити свій стан у пам'яті й потім зберегти різні результати. Блокування на сеанс або еквівалентна серіалізація має охоплювати всю послідовність завантаження, обміну та збереження, якщо обидва запити ділять один віддалений вхід; блокування лише фінального запису не узгоджує їхні попередні знімки. Різні сеанси повинні мати різні файли й незалежні блокування.
Під час виходу завершіть потрібний віддалений сеанс і відкликайте його локальний стан кукі згідно з політикою застосунку. Щойно вибраний проксі можна тоді приєднати до будь-якого нового сеансу, який почне користувач, не покладаючи на адресу проксі рішення про те, чий вхід перебуває в пам'яті.