צנצנות קוקיז של 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.
הבחינו גם בין הורדה מוצלחת להתמדה מוצלחת. תיעוד צנצנת הקוקיז מציין שכשל כתיבה בזמן הניקוי אינו מוחזר כשגיאת העברה רגילה. בדקו בעלות על התיקייה, הרשאות ופלט אבחון של האפליקציה כשהתחברות עובדת לבקשה אחת ונעלמת בבאה.
בקשות מקבילות מציגות גבול נוסף. שני עובדים יכולים לטעון את אותה צנצנת ישנה, לשנות באופן עצמאי את המצב שלהם בזיכרון ואז לשמור תוצאות שונות. מנעול לכל הפעלה או סדירה שקולה חייב לכסות את כל רצף הטעינה, ההחלפה והשמירה אם שתי הבקשות חולקות התחברות מרוחקת אחת; נעילה של הכתיבה הסופית בלבד אינה מיישבת את התמונות המוקדמות שלהן. הפעלות שונות צריכות לקבל קבצים שונים ומנעולים בלתי תלויים.
ביציאה, סיימו את ההפעלה המרוחקת המיועדת והוציאו לגמלאות את מצב הקוקיז המקומי שלה לפי המדיניות של האפליקציה. פרוקסי שנבחר לאחרונה יכול אז להתחבר לכל הפעלה חדשה שהמשתמש מתחיל, בלי שכתובת הפרוקסי תקבע של מי ההתחברות בזיכרון.