Βάζα cookies του PHP cURL για ξεχωριστές συνεδρίες χρηστών
Σχεδιασμός της διατήρησης cookies του PHP cURL γύρω από την απομακρυσμένη συνεδρία: αξιόπιστα ονόματα αρχείων, ρητή αποθήκευση και ταυτόχρονα αιτήματα.
Μια εφαρμογή PHP εξυπηρετεί την Alice και τον Bob, και οι δύο χρησιμοποιούν τον διακομιστικό πελάτη cURL για να φτάσουν στον ίδιο απομακρυσμένο ιστότοπο μέσω διακομιστή μεσολάβησης. Αν κάθε αίτημα φορτώνει το cookies.txt, οι δύο χρήστες μπορούν να κληρονομήσουν την ίδια απομακρυσμένη σύνδεση. Η αλλαγή των διευθύνσεων μεσολάβησης δεν χωρίζει αυτό το αρχείο.
Επιλέξτε τον ιδιοκτήτη του cookie πριν επιλέξετε το όνομα αρχείου. Συνήθως είναι η λογική απομακρυσμένη συνεδρία της εφαρμογής: ένας τοπικός χρήστης, ένας συγκεκριμένος απομακρυσμένος λογαριασμός και, όπου χρειάζεται, ένας ξεχωριστός χώρος εργασίας. Ένα τελικό σημείο μεσολάβησης είναι επιλογή δρομολόγησης, όχι αξιόπιστο αναγνωριστικό συνεδρίας. Πολλοί χρήστες μπορούν να μοιράζονται ένα τελικό σημείο και ένα τελικό σημείο μπορεί να εναλλάσσει εξόδους.
Φορτώστε και αποθηκεύστε το βάζο της ίδιας συνεδρίας
Αφήστε την εφαρμογή να αντιστοιχίσει την πιστοποιημένη συνεδρία της σε ένα κλειδί αρχείου που παράγει ο διακομιστής. Με ιδιωτικό κατάλογο cookies και ένα αξιόπιστο $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 παρέχει υποψήφια τελικά σημεία. Χρησιμοποιήστε μια λαβή χωρίς ρυθμισμένη ταυτοποίηση μεσολάβησης ή αποθηκευμένα διαπιστευτήρια μεσολάβησης και κρατήστε την κατάσταση των cookies ανατεθειμένη στη σκοπούμενη συνεδρία. Αυτό το απόσπασμα ρυθμίζει μια λαβή· η εφαρμογή εκτελεί τη μεταφορά και ελέγχει το αποτέλεσμα μέσω της κανονικής ροής αιτημάτων. Το COOKIEFILE φορτώνει προηγούμενα cookies της συνεδρίας. Το COOKIEJAR επιλέγει πού γράφει η λαβή τα διατηρούμενα cookies. Ο ορισμός μόνο του αρχείου εξόδου δεν φορτώνει την προηγούμενη σύνδεση.
Μια νέα συνεδρία μπορεί να ξεκινήσει χωρίς αρχείο. Δώστε στην πρώτη της μεταφορά τη σκοπούμενη διαδρομή βάζου, αφήστε τον ιστότοπο να εδραιώσει τα cookies και αποθηκεύστε την κατάσταση που προκύπτει για το επόμενο αίτημα. Ο κατάλογος cookies πρέπει να είναι εγγράψιμος από τον εργάτη της εφαρμογής και να μένει έξω από το δημόσια σερβιριζόμενο δέντρο εγγράφων. Μη μετατρέπετε όνομα χρήστη ή διαδρομή που παρέχει επισκέπτης σε όνομα αρχείου· αναζητήστε το αξιόπιστο κλειδί στον διακομιστή.
Η αποθήκευση χρειάζεται θέση στον κύκλο ζωής του αιτήματος
Το libcurl γράφει συνήθως το βάζο κατά τον καθαρισμό της λαβής. Αν η εφαρμογή χρειάζεται ρητό σημείο αποθήκευσης μετά την απομακρυσμένη ανταλλαγή, μπορεί να ζητήσει:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Αυτό γράφει τα cookies που γνωρίζει τώρα η λαβή στο ρυθμισμένο βάζο της. Ολοκληρώστε τη χρήση της λαβής για εκείνη τη συνεδρία πριν την αναθέσετε σε άσχετη εργασία. Η αλλαγή μόνο της διαδρομής του βάζου σε μια λαβή που κρατά ήδη τα cookies της Alice δεν ισοδυναμεί με τη δημιουργία καθαρής συνεδρίας του Bob.
Διακρίνετε επίσης μια επιτυχημένη λήψη από μια επιτυχημένη διατήρηση. Η τεκμηρίωση του βάζου cookies σημειώνει ότι μια αποτυχία εγγραφής κατά τον καθαρισμό δεν επιστρέφεται ως συνηθισμένο σφάλμα μεταφοράς. Ελέγξτε την κυριότητα του καταλόγου, τα δικαιώματα και τη διαγνωστική έξοδο της εφαρμογής όταν μια σύνδεση λειτουργεί για ένα αίτημα και εξαφανίζεται στο επόμενο.
Τα ταυτόχρονα αιτήματα εισάγουν άλλο ένα όριο. Δύο εργάτες μπορούν να φορτώσουν το ίδιο παλιό βάζο, να αλλάξουν ανεξάρτητα την κατάστασή τους στη μνήμη και μετά να αποθηκεύσουν διαφορετικά αποτελέσματα. Ένα κλείδωμα ανά συνεδρία ή ισοδύναμη σειριοποίηση πρέπει να καλύπτει ολόκληρη την ακολουθία φόρτωσης, ανταλλαγής και αποθήκευσης αν και τα δύο αιτήματα μοιράζονται μία απομακρυσμένη σύνδεση· το κλείδωμα μόνο της τελικής εγγραφής δεν συμβιβάζει τα προηγούμενα στιγμιότυπά τους. Διαφορετικές συνεδρίες πρέπει να έχουν διαφορετικά αρχεία και ανεξάρτητα κλειδώματα.
Κατά την αποσύνδεση, τερματίστε τη σκοπούμενη απομακρυσμένη συνεδρία και αποσύρετε την τοπική κατάσταση cookies σύμφωνα με την πολιτική της εφαρμογής. Ένας πρόσφατα επιλεγμένος μεσολαβητής μπορεί τότε να συνδεθεί με οποιαδήποτε νέα συνεδρία ξεκινήσει ο χρήστης, χωρίς η διεύθυνση μεσολάβησης να αποφασίζει ποιανού η σύνδεση βρίσκεται στη μνήμη.