Προστασία Session ID σε PHP. Παγίδες της χρήσης περιόδων σύνδεσης στην PHP Μεταβίβαση μιας τιμής ή ενός πίνακα χρησιμοποιώντας μια περίοδο λειτουργίας PHP

Χαιρετισμούς, αγαπητή κοινότητα.

Πρώτα απ 'όλα, θέλω να σας ευχαριστήσω για μια πολύ χρήσιμη πηγή. Πολλές φορές βρήκα πολλές ενδιαφέρουσες ιδέες και πρακτικές συμβουλές εδώ.

Ο σκοπός αυτού του άρθρου είναι να τονίσει τις παγίδες της χρήσης συνεδριών στην PHP. Φυσικά, υπάρχει τεκμηρίωση PHP και πολλά παραδείγματα, και αυτό το άρθρο δεν προορίζεται να είναι ένας πλήρης οδηγός. Έχει σχεδιαστεί για να αποκαλύπτει ορισμένες από τις αποχρώσεις της εργασίας με συνεδρίες και να προστατεύει τους προγραμματιστές από περιττό χάσιμο χρόνου.

Το πιο συνηθισμένο παράδειγμα χρήσης περιόδων σύνδεσης είναι, φυσικά, η εξουσιοδότηση χρήστη. Ας ξεκινήσουμε με την πιο βασική υλοποίηση για να την αναπτύξουμε σταδιακά καθώς προκύπτουν νέες εργασίες.

(Για να εξοικονομήσουμε χώρο και χρόνο, θα περιορίσουμε τα παραδείγματά μας μόνο στις ίδιες τις συναρτήσεις συνεδρίας, αντί να δημιουργήσουμε εδώ μια ολοκληρωμένη δοκιμαστική εφαρμογή με όμορφη ιεραρχία κλάσεων, ολοκληρωμένο χειρισμό σφαλμάτων και άλλα καλά πράγματα).

Συνάρτηση startSession() ( // Εάν η περίοδος λειτουργίας έχει ήδη ξεκινήσει, σταματήστε την εκτέλεση και επιστρέψτε TRUE // (η παράμετρος session.auto_start στο αρχείο ρυθμίσεων php.ini πρέπει να είναι απενεργοποιημένη - η προεπιλεγμένη τιμή) εάν επιστρέψει (session_id()) true; else return session_start(); // Σημείωση: Πριν από την έκδοση 5.3.0, η συνάρτηση session_start() επέστρεψε TRUE ακόμα κι αν παρουσιάστηκε σφάλμα. // Εάν χρησιμοποιείτε έκδοση πριν από την 5.3.0, εκτελέστε έναν επιπλέον έλεγχο για session_id() // μετά την κλήση της session_start() ) της συνάρτησης καταστροφήSession() ( if (session_id()) ( // Εάν υπάρχει ενεργή περίοδος λειτουργίας, διαγράψτε τα cookie περιόδου λειτουργίας, setcookie(session_name(), session_id(), time( )-60*60*24); // και καταστρέψτε τη συνεδρία session_unset( ); session_destroy(); ) )

Σημείωση: Υποτίθεται ότι ο αναγνώστης έχει βασικές γνώσεις για τις συνεδρίες PHP, επομένως δεν θα καλύψουμε εδώ την αρχή λειτουργίας των συναρτήσεων session_start() και session_destroy(). Οι εργασίες διάταξης της φόρμας σύνδεσης και ο έλεγχος ταυτότητας χρήστη δεν σχετίζονται με το θέμα του άρθρου, επομένως θα τις παραλείψουμε επίσης. Επιτρέψτε μου απλώς να σας υπενθυμίσω ότι για να προσδιορίσουμε τον χρήστη σε κάθε επόμενο αίτημα, τη στιγμή της επιτυχούς σύνδεσης, πρέπει να αποθηκεύσουμε το αναγνωριστικό χρήστη σε μια μεταβλητή περιόδου λειτουργίας (με όνομα userid, για παράδειγμα), η οποία θα είναι διαθέσιμη σε όλα τα επόμενα αιτήματα εντός τη ζωή της συνεδρίας. Είναι επίσης απαραίτητο να υλοποιήσουμε την επεξεργασία του αποτελέσματος της συνάρτησης startSession(). Εάν η συνάρτηση επιστρέψει FALSE, εμφανίστε τη φόρμα σύνδεσης στο πρόγραμμα περιήγησης. Εάν η συνάρτηση επέστρεψε TRUE και υπάρχει μια μεταβλητή περιόδου λειτουργίας που περιέχει το αναγνωριστικό του εξουσιοδοτημένου χρήστη (στην περίπτωσή μας - userid), εμφανίστε τη σελίδα του εξουσιοδοτημένου χρήστη (για περισσότερες πληροφορίες σχετικά με τον χειρισμό σφαλμάτων, δείτε την προσθήκη με ημερομηνία 2013-06- 07 στην ενότητα για τις μεταβλητές περιόδου λειτουργίας).

Μέχρι στιγμής όλα είναι ξεκάθαρα. Οι ερωτήσεις ξεκινούν όταν πρέπει να εφαρμόσετε τον έλεγχο αδράνειας χρήστη (χρονικό όριο περιόδου λειτουργίας), να επιτρέψετε σε πολλούς χρήστες να εργάζονται ταυτόχρονα σε ένα πρόγραμμα περιήγησης και επίσης να προστατέψετε τις περιόδους σύνδεσης από μη εξουσιοδοτημένη χρήση. Αυτό θα συζητηθεί παρακάτω.

Έλεγχος αδράνειας χρήστη με χρήση ενσωματωμένων εργαλείων PHP Το πρώτο ερώτημα που προκύπτει συχνά μεταξύ των προγραμματιστών διαφόρων κονσολών για χρήστες είναι ο αυτόματος τερματισμός της συνεδρίας σε περίπτωση αδράνειας εκ μέρους του χρήστη. Δεν υπάρχει τίποτα πιο εύκολο από το να το κάνετε αυτό χρησιμοποιώντας τις ενσωματωμένες δυνατότητες της PHP. (Αυτή η επιλογή δεν είναι ιδιαίτερα αξιόπιστη ή ευέλικτη, αλλά θα την εξετάσουμε για πληρότητα).

Συνάρτηση startSession() ( // Λήξη χρονικού ορίου αδράνειας χρήστη (σε δευτερόλεπτα) $sessionLifetime = 300; if (session_id()) επιστρέψει true; // Ορίστε τη διάρκεια ζωής του cookie ini_set("session.cookie_lifetime", $sessionLifetime); // Εάν ο χρήστης ορίστηκε το χρονικό όριο αδράνειας, ορίστε τη διάρκεια ζωής της περιόδου σύνδεσης στον διακομιστή // Σημείωση: Για έναν διακομιστή παραγωγής, συνιστάται να προκαθορίσετε αυτές τις παραμέτρους στο αρχείο php.ini εάν ($sessionLifetime) ini_set("session.gc_maxlifetime", $sessionLifetime) ; if (session_start( )) ( setcookie(session_name(), session_id(), time()+$sessionLifetime); return true; ) αλλιώς επιστροφή false; )

Μερικές διευκρινίσεις. Όπως γνωρίζετε, η PHP καθορίζει ποια περίοδος λειτουργίας πρέπει να ξεκινήσει από το όνομα cookie που αποστέλλεται από το πρόγραμμα περιήγησης στην κεφαλίδα αιτήματος. Το πρόγραμμα περιήγησης, με τη σειρά του, λαμβάνει αυτό το cookie από τον διακομιστή, όπου το τοποθετεί η συνάρτηση session_start(). Εάν το cookie του προγράμματος περιήγησης έχει λήξει, δεν θα σταλεί στο αίτημα, πράγμα που σημαίνει ότι η PHP δεν θα μπορεί να καθορίσει ποια περίοδο λειτουργίας θα ξεκινήσει και θα το αντιμετωπίσει ως δημιουργία νέας περιόδου λειτουργίας. Η παράμετρος ρυθμίσεων PHP session.gc_maxlifetime, η οποία ορίζεται ίση με το χρονικό όριο αδράνειας χρήστη, ορίζει τη διάρκεια ζωής μιας περιόδου λειτουργίας PHP και ελέγχεται από τον διακομιστή. Ο έλεγχος της διάρκειας ζωής της περιόδου λειτουργίας λειτουργεί ως εξής (εδώ εξετάζουμε ένα παράδειγμα αποθήκευσης περιόδων σύνδεσης σε προσωρινά αρχεία ως την πιο κοινή και προεπιλεγμένη επιλογή στην PHP).

Όταν δημιουργείται μια νέα περίοδος λειτουργίας, δημιουργείται ένα αρχείο με το όνομα sess_ στον κατάλογο που έχει οριστεί ως κατάλογος για την αποθήκευση συνεδριών στην παράμετρο ρυθμίσεων PHP session.save_path, όπου βρίσκεται το αναγνωριστικό περιόδου λειτουργίας. Στη συνέχεια, σε κάθε αίτημα, τη στιγμή της εκκίνησης μιας ήδη υπάρχουσας συνεδρίας, η PHP ενημερώνει τον χρόνο τροποποίησης αυτού του αρχείου. Έτσι, σε κάθε επόμενο αίτημα, η PHP, από τη διαφορά μεταξύ της τρέχουσας ώρας και της ώρας της τελευταίας τροποποίησης του αρχείου συνεδρίας, μπορεί να καθορίσει εάν η περίοδος λειτουργίας είναι ενεργή ή η διάρκεια ζωής της έχει ήδη λήξει. (Ο μηχανισμός διαγραφής παλαιών αρχείων συνεδρίας αναλύεται λεπτομερέστερα στην επόμενη ενότητα.)

Σημείωση: Θα πρέπει να σημειωθεί εδώ ότι η παράμετρος session.gc_maxlifetime ισχύει για όλες τις περιόδους λειτουργίας ενός διακομιστή (ακριβέστερα, σε μία κύρια διαδικασία PHP). Στην πράξη, αυτό σημαίνει ότι εάν πολλές τοποθεσίες εκτελούνται στον διακομιστή και καθένας από αυτούς έχει το δικό του χρονικό όριο αδράνειας χρήστη, τότε η ρύθμιση αυτής της παραμέτρου σε έναν από τους ιστότοπους θα οδηγήσει στη ρύθμισή του για άλλους ιστότοπους. Το ίδιο ισχύει και για την κοινόχρηστη φιλοξενία. Για να αποφευχθεί αυτή η κατάσταση, χρησιμοποιούνται ξεχωριστοί κατάλογοι συνεδριών για κάθε τοποθεσία στον ίδιο διακομιστή. Ο ορισμός της διαδρομής στον κατάλογο συνεδριών γίνεται χρησιμοποιώντας την παράμετρο session.save_path στο αρχείο ρυθμίσεων php.ini ή καλώντας τη συνάρτηση ini_set(). Μετά από αυτό, οι περίοδοι λειτουργίας κάθε τοποθεσίας θα αποθηκευτούν σε ξεχωριστούς καταλόγους και η παράμετρος session.gc_maxlifetime που έχει οριστεί σε έναν από τους ιστότοπους θα είναι έγκυρη μόνο για την περίοδο λειτουργίας του. Δεν θα εξετάσουμε αυτή την περίπτωση λεπτομερώς, ειδικά επειδή έχουμε μια πιο ευέλικτη επιλογή για την παρακολούθηση της αδράνειας των χρηστών.

Έλεγχος αδράνειας χρήστη με χρήση μεταβλητών συνεδρίας Φαίνεται ότι η προηγούμενη επιλογή, με όλη της την απλότητα (μόλις μερικές επιπλέον γραμμές κώδικα), δίνει όλα όσα χρειαζόμαστε. Τι γίνεται όμως αν κάθε αίτημα δεν μπορεί να θεωρηθεί ως αποτέλεσμα δραστηριότητας χρήστη; Για παράδειγμα, μια σελίδα έχει ένα χρονόμετρο που υποβάλλει περιοδικά ένα αίτημα AJAX για λήψη ενημερώσεων από τον διακομιστή. Ένα τέτοιο αίτημα δεν μπορεί να θεωρηθεί ως δραστηριότητα χρήστη, πράγμα που σημαίνει ότι η αυτόματη παράταση της διάρκειας ζωής της περιόδου σύνδεσης δεν είναι σωστή σε αυτήν την περίπτωση. Γνωρίζουμε όμως ότι η PHP ενημερώνει αυτόματα τον χρόνο τροποποίησης του αρχείου συνεδρίας κάθε φορά που καλείται η συνάρτηση session_start(), που σημαίνει ότι οποιοδήποτε αίτημα θα οδηγήσει σε παράταση της διάρκειας ζωής της περιόδου σύνδεσης και το χρονικό όριο αδράνειας χρήστη δεν θα συμβεί ποτέ. Επιπλέον, η τελευταία σημείωση από την προηγούμενη ενότητα σχετικά με τις περιπλοκές της παραμέτρου session.gc_maxlifetime μπορεί να φαίνεται πολύ συγκεχυμένη και δύσκολη στην εφαρμογή για ορισμένους.

Για να λύσουμε αυτό το πρόβλημα, θα εγκαταλείψουμε τη χρήση ενσωματωμένων μηχανισμών PHP και θα εισαγάγουμε πολλές νέες μεταβλητές περιόδου λειτουργίας που θα μας επιτρέψουν να ελέγχουμε μόνοι μας τον χρόνο αδράνειας του χρήστη.

Λειτουργία startSession($isUserActivity=true) ($sessionLifetime = 300; if (session_id()) επιστρέψει true; // Ορίστε τη διάρκεια ζωής του cookie πριν κλείσετε το πρόγραμμα περιήγησης (θα ελέγχουμε τα πάντα στην πλευρά του διακομιστή) ini_set("session. cookie_lifetime", 0) ; if (! session_start()) return false; $t = time(); if ($sessionLifetime) ( // Εάν έχει οριστεί το χρονικό όριο αδράνειας χρήστη, // ελέγξτε το χρόνο που έχει παρέλθει από την τελευταία δραστηριότητα χρήστη // (χρόνος τελευταίου αιτήματος όταν ενημερώθηκε η μεταβλητή συνεδρίας τελευταίας δραστηριότητας) if (isset($_SESSION["lastactivity"]) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( // Εάν ο χρόνος έχει παρέλθει από τότε η τελευταία δραστηριότητα του χρήστη, / / ​​είναι μεγαλύτερη από το χρονικό όριο αδράνειας, που σημαίνει ότι η περίοδος σύνδεσης έχει λήξει και πρέπει να τερματίσετε τη συνεδρία καταστρέφειSession(); return false; ) else ( // Εάν το χρονικό όριο λήξης δεν έχει συμβεί ακόμα, // και εάν το αίτημα προήλθε ως αποτέλεσμα δραστηριότητας χρήστη, // ενημερώστε τη μεταβλητή lastactivity με την τιμή της τρέχουσας one time, // επεκτείνοντας έτσι τον χρόνο συνεδρίας κατά ένα άλλο sessionLifetime δευτερόλεπτα εάν ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) επιστροφή true? )

Ας συνοψίσουμε. Σε κάθε αίτημα ελέγχουμε αν έχει φτάσει το χρονικό όριο από την τελευταία δραστηριότητα χρήστη μέχρι την τρέχουσα στιγμή και αν έχει φτάσει, καταστρέφουμε τη συνεδρία και διακόπτουμε την εκτέλεση της συνάρτησης, επιστρέφοντας FALSE. Εάν δεν έχει συμπληρωθεί το χρονικό όριο και η παράμετρος $isUserActivity με την τιμή TRUE μεταβιβαστεί στη συνάρτηση, ενημερώνουμε την ώρα της τελευταίας δραστηριότητας του χρήστη. Το μόνο που έχουμε να κάνουμε είναι να προσδιορίσουμε στο σενάριο κλήσης εάν το αίτημα είναι αποτέλεσμα δραστηριότητας χρήστη και, αν όχι, να καλέσουμε τη συνάρτηση startSession με την παράμετρο $isUserActivity να έχει οριστεί σε FALSE.

Προσθήκη από 07-06-2013 Επεξεργασία του αποτελέσματος της συνάρτησης sessionStart()

Τα σχόλια επεσήμαναν ότι η επιστροφή FALSE δεν παρέχει πλήρη κατανόηση της αιτίας του σφάλματος και αυτό είναι απολύτως δίκαιο. Δεν δημοσίευσα εδώ λεπτομερή χειρισμό σφαλμάτων (το μήκος του άρθρου είναι ήδη αρκετά μεγάλο), καθώς αυτό δεν σχετίζεται άμεσα με το θέμα του άρθρου. Δεδομένων όμως των σχολίων, θα διευκρινίσω.

Όπως μπορείτε να δείτε, η λειτουργία sessionStart μπορεί να επιστρέψει FALSE σε δύο περιπτώσεις. Είτε δεν ήταν δυνατή η έναρξη της συνεδρίας λόγω ορισμένων εσωτερικών σφαλμάτων διακομιστή (για παράδειγμα, εσφαλμένων ρυθμίσεων συνεδρίας στο php.ini), είτε η διάρκεια ζωής της περιόδου λειτουργίας έχει λήξει. Στην πρώτη περίπτωση, πρέπει να ανακατευθύνουμε τον χρήστη σε μια σελίδα με σφάλμα που αναφέρει ότι υπάρχουν προβλήματα στον διακομιστή και σε μια φόρμα επικοινωνίας με την υποστήριξη. Στη δεύτερη περίπτωση, πρέπει να μεταφέρουμε τον χρήστη στη φόρμα σύνδεσης και να εμφανίσουμε σε αυτήν αντίστοιχο μήνυμα που να αναφέρει ότι η συνεδρία έχει λήξει. Για να γίνει αυτό, πρέπει να εισάγουμε κωδικούς σφάλματος και να επιστρέψουμε τον αντίστοιχο κωδικό αντί για FALSE και στη μέθοδο κλήσης, να τον ελέγξουμε και να ενεργήσουμε ανάλογα.

Τώρα, ακόμα κι αν μια περίοδος σύνδεσης στον διακομιστή εξακολουθεί να υπάρχει, θα καταστραφεί την πρώτη φορά που θα προσπελαστεί εάν το χρονικό όριο αδράνειας του χρήστη έχει λήξει. Και αυτό θα συμβεί ανεξάρτητα από τη διάρκεια ζωής της περιόδου σύνδεσης που έχει οριστεί στις καθολικές ρυθμίσεις PHP.

Σημείωση: Τι θα συμβεί εάν το πρόγραμμα περιήγησης έκλεισε και το cookie ονόματος περιόδου λειτουργίας καταστρεφόταν αυτόματα; Το αίτημα προς τον διακομιστή την επόμενη φορά που θα ανοίξει το πρόγραμμα περιήγησης δεν θα περιέχει το cookie περιόδου λειτουργίας και ο διακομιστής δεν θα μπορεί να ανοίξει τη συνεδρία και να ελέγξει το χρονικό όριο αδράνειας του χρήστη. Για εμάς, αυτό ισοδυναμεί με τη δημιουργία μιας νέας περιόδου σύνδεσης και δεν επηρεάζει τη λειτουργικότητα ή την ασφάλεια με κανέναν τρόπο. Αλλά τίθεται ένα δίκαιο ερώτημα - ποιος θα καταστρέψει την παλιά συνεδρία, αν μέχρι τώρα την είχαμε καταστρέψει μετά τη λήξη του χρονικού ορίου; Ή θα παραμένει για πάντα στον κατάλογο συνεδριών; Για να καθαρίσετε παλιές συνεδρίες στην PHP, υπάρχει ένας μηχανισμός που ονομάζεται συλλογή απορριμμάτων. Εκτελείται τη στιγμή της επόμενης αίτησης στον διακομιστή και διαγράφει όλες τις παλιές περιόδους λειτουργίας με βάση την τελευταία ημερομηνία τροποποίησης των αρχείων περιόδου λειτουργίας. Αλλά ο μηχανισμός συλλογής σκουπιδιών δεν ξεκινά με κάθε αίτημα προς τον διακομιστή. Η συχνότητα (ή μάλλον, η πιθανότητα) εκκίνησης καθορίζεται από δύο παραμέτρους ρυθμίσεων session.gc_probability και session.gc_divisor. Το αποτέλεσμα της διαίρεσης της πρώτης παραμέτρου με τη δεύτερη είναι η πιθανότητα εκκίνησης του μηχανισμού συλλογής σκουπιδιών. Έτσι, για να εκκινείται ο μηχανισμός εκκαθάρισης συνεδρίας με κάθε αίτημα προς τον διακομιστή, αυτές οι παράμετροι πρέπει να οριστούν σε ίσες τιμές, για παράδειγμα «1». Αυτή η προσέγγιση εγγυάται έναν καθαρό κατάλογο συνεδρίας, αλλά είναι προφανώς πολύ ακριβή για τον διακομιστή. Επομένως, στα συστήματα παραγωγής, η προεπιλεγμένη τιμή του session.gc_divisor ορίζεται στο 1000, πράγμα που σημαίνει ότι ο μηχανισμός συλλογής σκουπιδιών θα λειτουργεί με πιθανότητα 1/1000. Εάν πειραματιστείτε με αυτές τις ρυθμίσεις στο αρχείο σας php.ini, μπορεί να παρατηρήσετε ότι στην περίπτωση που περιγράφεται παραπάνω, όταν το πρόγραμμα περιήγησης κλείνει και διαγράφει όλα τα cookie του, υπάρχουν ακόμα παλιές συνεδρίες στον κατάλογο συνεδριών για λίγο. Αυτό όμως δεν πρέπει να σας ανησυχεί, γιατί... όπως ήδη αναφέρθηκε, αυτό δεν επηρεάζει σε καμία περίπτωση την ασφάλεια του μηχανισμού μας.

Ενημέρωση από 07-06-2013 Αποτροπή παγώματος σεναρίων λόγω κλειδώματος αρχείου περιόδου λειτουργίας

Τα σχόλια έθεσαν το ζήτημα της ταυτόχρονης εκτέλεσης σεναρίων παγώματος λόγω αποκλεισμού του αρχείου συνεδρίας (η πιο εντυπωσιακή επιλογή είναι η μεγάλη δημοσκόπηση).

Αρχικά, σημειώνω ότι αυτό το πρόβλημα δεν εξαρτάται άμεσα από το φορτίο του διακομιστή ή τον αριθμό των χρηστών. Φυσικά, όσο περισσότερα αιτήματα, τόσο πιο αργά εκτελούνται τα σενάρια. Αλλά αυτό είναι μια έμμεση εξάρτηση. Το πρόβλημα εμφανίζεται μόνο μέσα σε μία περίοδο λειτουργίας, όταν ο διακομιστής λαμβάνει πολλά αιτήματα για λογαριασμό ενός χρήστη (για παράδειγμα, ένα από αυτά είναι μακροσκελής δημοσκόπησης και τα υπόλοιπα είναι κανονικά αιτήματα). Κάθε αίτημα προσπαθεί να αποκτήσει πρόσβαση στο ίδιο αρχείο συνεδρίας και αν το προηγούμενο αίτημα δεν ξεκλείδωσε το αρχείο, τότε το επόμενο θα παραμείνει σε αναμονή.

Για να διατηρήσετε το κλείδωμα του αρχείου συνεδρίας στο ελάχιστο, συνιστάται ανεπιφύλακτα να κλείσετε τη συνεδρία καλώντας τη συνάρτηση session_write_close() αμέσως μετά την ολοκλήρωση όλων των ενεργειών με μεταβλητές περιόδου λειτουργίας. Στην πράξη, αυτό σημαίνει ότι δεν πρέπει να αποθηκεύετε τα πάντα σε μεταβλητές περιόδου λειτουργίας και να έχετε πρόσβαση σε αυτές καθ' όλη τη διάρκεια της εκτέλεσης του σεναρίου. Και αν χρειάζεται να αποθηκεύσετε κάποια δεδομένα εργασίας σε μεταβλητές περιόδου λειτουργίας, διαβάστε τα αμέσως μόλις ξεκινήσει η συνεδρία, αποθηκεύστε τα σε τοπικές μεταβλητές για μελλοντική χρήση και κλείστε τη συνεδρία (δηλαδή κλείστε τη συνεδρία χρησιμοποιώντας τη συνάρτηση session_write_close και όχι καταστρέψτε τη χρησιμοποιώντας session_destroy ).

Στο παράδειγμά μας, αυτό σημαίνει ότι αμέσως μετά το άνοιγμα μιας συνεδρίας, τον έλεγχο της διάρκειας ζωής της και την ύπαρξη εξουσιοδοτημένου χρήστη, πρέπει να διαβάσουμε και να αποθηκεύσουμε όλες τις πρόσθετες μεταβλητές περιόδου λειτουργίας που απαιτούνται από την εφαρμογή (εάν υπάρχουν) και στη συνέχεια να κλείσουμε τη συνεδρία χρησιμοποιώντας μια κλήση σε session_write_close() και να συνεχίσει την εκτέλεση ενός σεναρίου, είτε πρόκειται για μεγάλη δημοσκόπηση είτε για κανονικό αίτημα.

Προστασία συνεδριών από μη εξουσιοδοτημένη χρήση Ας φανταστούμε μια κατάσταση. Ένας από τους χρήστες σας λαμβάνει ένα Trojan που κλέβει τα cookies του προγράμματος περιήγησης (στα οποία είναι αποθηκευμένη η συνεδρία μας) και τον στέλνει στο καθορισμένο email. Ο εισβολέας αποκτά το cookie και το χρησιμοποιεί για να παραπλανήσει ένα αίτημα εκ μέρους του εξουσιοδοτημένου χρήστη μας. Ο διακομιστής αποδέχεται με επιτυχία και επεξεργάζεται αυτό το αίτημα σαν να προήλθε από εξουσιοδοτημένο χρήστη. Εάν δεν εφαρμοστεί πρόσθετη επαλήθευση της διεύθυνσης IP, μια τέτοια επίθεση θα οδηγήσει σε επιτυχή παραβίαση του λογαριασμού του χρήστη με όλες τις επακόλουθες συνέπειες.

Γιατί ήταν δυνατό αυτό; Προφανώς, επειδή το όνομα και το αναγνωριστικό περιόδου σύνδεσης είναι πάντα τα ίδια για όλη τη διάρκεια της συνεδρίας και εάν λάβετε αυτά τα δεδομένα, μπορείτε εύκολα να στείλετε αιτήματα για λογαριασμό άλλου χρήστη (φυσικά, εντός της διάρκειας ζωής αυτής της περιόδου σύνδεσης). Αυτός μπορεί να μην είναι ο πιο συνηθισμένος τύπος επίθεσης, αλλά θεωρητικά φαίνεται αρκετά εφικτός, ειδικά αν σκεφτεί κανείς ότι ένας τέτοιος Trojan δεν χρειάζεται καν δικαιώματα διαχειριστή για να κλέβει τα cookies του προγράμματος περιήγησης του χρήστη.

Πώς μπορείτε να προστατευθείτε από επιθέσεις αυτού του είδους; Και πάλι, προφανώς, με τον περιορισμό της διάρκειας ζωής του αναγνωριστικού της περιόδου σύνδεσης και την περιοδική αλλαγή του αναγνωριστικού εντός της ίδιας περιόδου λειτουργίας. Μπορούμε επίσης να αλλάξουμε το όνομα της συνεδρίας διαγράφοντας εντελώς την παλιά και δημιουργώντας μια νέα συνεδρία, αντιγράφοντας όλες τις μεταβλητές συνεδρίας από την παλιά σε αυτήν. Αλλά αυτό δεν επηρεάζει την ουσία της προσέγγισης, επομένως για λόγους απλότητας θα περιοριστούμε μόνο στο αναγνωριστικό περιόδου λειτουργίας.

Είναι σαφές ότι όσο μικρότερη είναι η διάρκεια ζωής του αναγνωριστικού περιόδου σύνδεσης, τόσο λιγότερος χρόνος θα έχει ένας εισβολέας για να αποκτήσει και να χρησιμοποιήσει cookies για να πλαστογραφήσει ένα αίτημα χρήστη. Στην ιδανική περίπτωση, θα πρέπει να χρησιμοποιείται ένα νέο αναγνωριστικό για κάθε αίτημα, το οποίο θα ελαχιστοποιεί τη δυνατότητα χρήσης της συνεδρίας κάποιου άλλου. Αλλά θα εξετάσουμε τη γενική περίπτωση όταν ο χρόνος αναγέννησης του αναγνωριστικού περιόδου λειτουργίας ορίζεται αυθαίρετα.

(Θα παραλείψουμε το μέρος του κώδικα που έχει ήδη συζητηθεί).

Συνάρτηση startSession($isUserActivity=true) ( ​​// Διάρκεια ζωής αναγνωριστικού περιόδου λειτουργίας $idLifetime = 60; ... εάν ($idLifetime) ( // Εάν έχει οριστεί η διάρκεια ζωής του αναγνωριστικού περιόδου σύνδεσης, // ελέγξτε το χρόνο που έχει παρέλθει από την περίοδο λειτουργίας δημιουργήθηκε ή η τελευταία αναγέννηση // (ώρα του τελευταίου αιτήματος όταν ενημερώθηκε η ώρα έναρξης της μεταβλητής περιόδου λειτουργίας) if (isset($_SESSION["starttime"])) ( if ($t-$_SESSION["starttime"] >= $ idLifetime) ( // Ώρα έχει λήξει η διάρκεια ζωής του αναγνωριστικού περιόδου λειτουργίας // Δημιουργία νέου αναγνωριστικού session_regenerate_id(true); $_SESSION["starttime"] = $t; ) ) other ( // Φτάνουμε εδώ αν η περίοδος σύνδεσης έχει μόλις δημιουργήθηκε // Ορίστε την ώρα για τη δημιουργία του αναγνωριστικού περιόδου λειτουργίας στην τρέχουσα ώρα $_SESSION["starttime"] = $t; ) ) return true; )

Έτσι, κατά τη δημιουργία μιας νέας περιόδου σύνδεσης (η οποία συμβαίνει όταν ο χρήστης συνδεθεί με επιτυχία), ορίζουμε τη μεταβλητή περιόδου έναρξης, η οποία αποθηκεύει για εμάς τον χρόνο της τελευταίας γενιάς του αναγνωριστικού περιόδου λειτουργίας, σε μια τιμή ίση με την τρέχουσα ώρα διακομιστή. Στη συνέχεια, σε κάθε αίτημα, ελέγχουμε αν έχει περάσει αρκετός χρόνος (idLifetime) από την τελευταία γενιά του αναγνωριστικού και, αν ναι, δημιουργούμε ένα νέο. Έτσι, εάν κατά τη διάρκεια της καθορισμένης διάρκειας ζωής του αναγνωριστικού ο εισβολέας που έλαβε το cookie του εξουσιοδοτημένου χρήστη δεν έχει χρόνο να το χρησιμοποιήσει, το ψεύτικο αίτημα θα θεωρηθεί από τον διακομιστή ως μη εξουσιοδοτημένο και ο εισβολέας θα μεταφερθεί στη σελίδα σύνδεσης .

Σημείωση: Το νέο αναγνωριστικό περιόδου λειτουργίας μπαίνει στο cookie του προγράμματος περιήγησης όταν καλείται η συνάρτηση session_regenerate_id(), η οποία στέλνει το νέο cookie, παρόμοιο με τη συνάρτηση session_start(), επομένως δεν χρειάζεται να ενημερώσουμε μόνοι μας το cookie.

Αν θέλουμε να κάνουμε τις συνεδρίες μας όσο το δυνατόν ασφαλέστερες, αρκεί να ορίσουμε τη διάρκεια ζωής του αναγνωριστικού σε ένα ή ακόμα και να αφαιρέσουμε τη συνάρτηση session_regenerate_id() από αγκύλες και να αφαιρέσουμε όλους τους ελέγχους, που θα οδηγήσουν στην αναγέννηση του αναγνωριστικού σε κάθε αίτηση. (Δεν έχω δοκιμάσει την επίδραση αυτής της προσέγγισης στην απόδοση και μπορώ μόνο να πω ότι η συνάρτηση session_regenerate_id(true) εκτελεί ουσιαστικά μόνο 4 ενέργειες: δημιουργία νέου αναγνωριστικού, δημιουργία κεφαλίδας με το cookie περιόδου λειτουργίας, διαγραφή του παλιού και δημιουργία ένα νέο αρχείο συνεδρίας).

Λυρική παρέκβαση: Εάν ο Trojan αποδειχθεί τόσο έξυπνος που δεν στέλνει cookies στον εισβολέα, αλλά οργανώνει την αποστολή ενός προπαρασκευασμένου πλαστού αιτήματος αμέσως μετά τη λήψη του cookie, η μέθοδος που περιγράφεται παραπάνω πιθανότατα δεν θα είναι σε θέση να προστατέψτε από μια τέτοια επίθεση, επειδή μεταξύ της στιγμής που ο Trojan λαμβάνει το cookie και της αποστολής ενός ψεύτικο αίτημα δεν θα υπάρχει ουσιαστικά διαφορά και υπάρχει μεγάλη πιθανότητα αυτή τη στιγμή να μην αναδημιουργηθεί το αναγνωριστικό περιόδου λειτουργίας.

Δυνατότητα ταυτόχρονης εργασίας σε ένα πρόγραμμα περιήγησης για λογαριασμό πολλών χρηστών Η τελευταία εργασία που θα ήθελα να εξετάσω είναι η δυνατότητα ταυτόχρονης εργασίας σε ένα πρόγραμμα περιήγησης από πολλούς χρήστες. Αυτή η δυνατότητα είναι ιδιαίτερα χρήσιμη στο στάδιο της δοκιμής, όταν χρειάζεται να μιμηθείτε την ταυτόχρονη εργασία των χρηστών και συνιστάται να το κάνετε αυτό στο αγαπημένο σας πρόγραμμα περιήγησης, αντί να χρησιμοποιήσετε ολόκληρο το διαθέσιμο οπλοστάσιο ή να ανοίξετε πολλές παρουσίες του προγράμματος περιήγησης σε κατάσταση ανώνυμης περιήγησης .

Στα προηγούμενα παραδείγματά μας, δεν προσδιορίσαμε ρητά ένα όνομα συνεδρίας, επομένως χρησιμοποιήθηκε το προεπιλεγμένο όνομα PHP (PHPSESSID). Αυτό σημαίνει ότι όλες οι συνεδρίες που έχουμε δημιουργήσει μέχρι στιγμής έχουν στείλει ένα cookie στο πρόγραμμα περιήγησης με το όνομα PHPSESSID. Προφανώς, εάν το όνομα του cookie είναι πάντα το ίδιο, τότε δεν υπάρχει τρόπος να οργανωθούν δύο συνεδρίες με το ίδιο όνομα στο ίδιο πρόγραμμα περιήγησης. Αλλά αν χρησιμοποιούσαμε το δικό μας όνομα συνεδρίας για κάθε χρήστη, το πρόβλημα θα λυνόταν. Ας το κάνουμε.

Η συνάρτηση startSession($isUserActivity=true, $prefix=null) ( ... if (session_id()) επιστρέψει true; // Εάν το πρόθεμα χρήστη μεταβιβαστεί στις παραμέτρους, // ορίστε ένα μοναδικό όνομα συνεδρίας που περιλαμβάνει αυτό πρόθεμα, // διαφορετικά ορίστε κοινό όνομα για όλους τους χρήστες (για παράδειγμα, MYPROJECT) session_name("MYPROJECT".($prefix ? "_".$prefix: "")); ini_set("session.cookie_lifetime", 0); εάν (! session_start()) επιστρέψει ψευδές; ... )

Τώρα το μόνο που μένει είναι να βεβαιωθείτε ότι το σενάριο κλήσης περνά ένα μοναδικό πρόθεμα για κάθε χρήστη στη συνάρτηση startSession(). Αυτό μπορεί να γίνει, για παράδειγμα, περνώντας ένα πρόθεμα στις παραμέτρους GET/POST κάθε αιτήματος ή μέσω ενός πρόσθετου cookie.

Συμπέρασμα Εν κατακλείδι, θα παράσχω τον πλήρη τελικό κώδικα των λειτουργιών μας για την εργασία με συνεδρίες PHP, συμπεριλαμβανομένων όλων των εργασιών που συζητήθηκαν παραπάνω.

Συνάρτηση startSession($isUserActivity=true, $prefix=null) ( $sessionLifetime = 300; $idLifetime = 60; εάν (session_id()) επιστρέψει true; session_name("MYPROJECT".($prefix ? "_".$prefix: "")); ini_set("session.cookie_lifetime", 0); if (! session_start()) επιστροφή false; $t = time(); if ($sessionLifetime) ( if (isset($_SESSION["lastactivity"] ) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) (structSession(); return false; ) else ( if ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) εάν ($idLifetime ) ( if (isset($_SESSION["starttime"])) (if ($t-$_SESSION["starttime"] >= $idLifetime) ( session_regenerate_id(true); $_SESSION["starttime"] = $t; ) ) else ($_SESSION["starttime"] = $t; ) ) επιστροφή true; ) η συνάρτηση καταστρέφει το Session() ( if (session_id()) ( session_unset(); setcookie(session_name(), session_id(), time() -60*60*24); session_destroy(); ) )

Ελπίζω ότι αυτό το άρθρο θα εξοικονομήσει χρόνο για όσους δεν έχουν εμβαθύνει ποτέ στον μηχανισμό συνεδρίας και θα δώσει αρκετή εικόνα αυτού του μηχανισμού για όσους μόλις αρχίζουν να εξοικειώνονται με την PHP.

Χρειάζεστε όνομα χρήστη και κωδικό πρόσβασης;

Για να υποβάλετε άρθρα στο διαδίκτυο και να ελέγξετε την κατάσταση των υποβληθέντων άρθρων, πρέπει να εγγραφείτε και να συνδεθείτε στον λογαριασμό σας.

Λίστα ελέγχου για την προετοιμασία ενός άρθρου για υποβολή

Ως μέρος της διαδικασίας υποβολής άρθρου, οι συγγραφείς πρέπει να ελέγξουν ότι το άρθρο τους πληροί όλα τα ακόλουθα σημεία· τα άρθρα μπορούν να επιστραφούν στους συγγραφείς εάν δεν πληρούν αυτές τις απαιτήσεις.

Το άρθρο έχει προετοιμαστεί σύμφωνα με τις απαιτήσεις

Όροι μεταβίβασης πνευματικών δικαιωμάτων

Οι συγγραφείς διατηρούν τα πνευματικά δικαιώματα του έργου και παραχωρούν στο περιοδικό δικαιώματα πρώτης δημοσίευσης μαζί με το έργο, ενώ το αδειοδοτούν σύμφωνα με τους όρους της άδειας αναφοράς Creative Commons, η οποία επιτρέπει σε άλλους να διανέμουν αυτό το έργο με υποχρεωτική απόδοση στον συγγραφέα του έργου και έναν σύνδεσμο στην αρχική δημοσίευση σε αυτό το περιοδικό.

Δήλωση προστασίας προσωπικών δεδομένων

Τα ονόματα και οι διευθύνσεις ηλεκτρονικού ταχυδρομείου που εισάγονται στον ιστότοπο αυτού του περιοδικού θα χρησιμοποιούνται αποκλειστικά για τους σκοπούς που καθορίζονται από αυτό το περιοδικό και δεν θα χρησιμοποιηθούν για οποιονδήποτε άλλο σκοπό ούτε θα παρέχονται σε οποιοδήποτε άλλο πρόσωπο ή οντότητα.

Πριν την εγγραφή του στο σύστημα, ο χρήστης συμφωνεί με την πολιτική για την επεξεργασία και αποθήκευση προσωπικών δεδομένων.

Πληρωμές συγγραφέα

1500 χαρακτήρες με κενά: 300,00 (RUB)

Δημοσίευση 1 σελίδας χειρογράφου (1500 χαρακτήρες) - 300 ρούβλια. Τα γραφικά υλικά / πίνακες πληρώνονται χωριστά - 50 ρούβλια / 1 τεμάχιο. Το αντίγραφο του συγγραφέα, συμπεριλαμβανομένης της αποστολής εντός της Ρωσίας, πληρώνεται κατόπιν αιτήματος του συγγραφέα - 400 ρούβλια. Αποστολή στο εξωτερικό - 800 ρούβλια. Το κόστος αποστολής πιστοποιητικού αποδοχής του υλικού για δημοσίευση είναι 150 ρούβλια.

Μετάφραση των συνοδευτικών πληροφοριών (πλήρες όνομα, τόπος εργασίας των συγγραφέων, τίτλος, περίληψη, λέξεις-κλειδιά) στα αγγλικά 0,5 ρούβλια για κάθε χαρακτήρα, συμπεριλαμβανομένων των κενών.

Προσοχή! Οι συγγραφείς (υποψήφιοι και διδάκτορες επιστημών) που, σύμφωνα με το elibrary.ru, έχουν 300 ή περισσότερες αναφορές (το μερίδιο των αυτοαναφορών δεν πρέπει να υπερβαίνει το 30%) δημοσιεύονται δωρεάν. Εάν πληροίτε τα κριτήρια για δωρεάν δημοσίευση, κατά την υποβολή υλικού, στο πεδίο σχολίων, υποδείξτε έναν σύνδεσμο προς το προφίλ της βιβλιοθήκης σας με τον αριθμό των αναφορών. Τα έξοδα αποστολής για την παραλαβή καταβάλλονται χωριστά.

Η ασφάλεια του ιστότοπου βασίζεται στη διαχείριση συνεδριών. Όταν ένας χρήστης συνδέεται σε έναν ασφαλή ιστότοπο, παρέχει διαπιστευτήρια, συνήθως με τη μορφή ονόματος χρήστη και κωδικού πρόσβασης. Ο διακομιστής web δεν έχει ιδέα ποιος χρήστης είναι ήδη συνδεδεμένος ή πώς πλοηγείται από σελίδα σε σελίδα. Ο μηχανισμός συνεδρίας εμποδίζει τους χρήστες να πρέπει να εισάγουν έναν κωδικό πρόσβασης κάθε φορά που θέλουν να εκτελέσουν μια νέα ενέργεια ή να μεταβούν σε μια νέα σελίδα.

Ουσιαστικά, η διαχείριση περιόδων σύνδεσης διασφαλίζει ότι ο χρήστης που είναι συνδεδεμένος τη συγκεκριμένη στιγμή είναι αυτός που πιστοποιήθηκε. Αλλά δυστυχώς, οι συνεδρίες έχουν γίνει προφανής στόχος για τους χάκερ επειδή μπορούν να επιτρέψουν την πρόσβαση σε έναν διακομιστή ιστού χωρίς την ανάγκη ελέγχου ταυτότητας.

Μετά τον έλεγχο ταυτότητας του χρήστη, ο διακομιστής web του παρέχει ένα αναγνωριστικό περιόδου σύνδεσης. Αυτό το αναγνωριστικό αποθηκεύεται στο πρόγραμμα περιήγησης και αντικαθίσταται όποτε απαιτείται έλεγχος ταυτότητας. Αυτό σας επιτρέπει να αποφύγετε επαναλαμβανόμενες διαδικασίες σύνδεσης/εισαγωγής κωδικού πρόσβασης. Όλα αυτά συμβαίνουν στο παρασκήνιο και δεν προκαλούν ενόχληση στον χρήστη. Φανταστείτε να εισάγατε το όνομα χρήστη και τον κωδικό πρόσβασής σας κάθε φορά που προβάλλατε μια νέα σελίδα!

Σε αυτό το άρθρο θα προσπαθήσω να περιγράψω όλους τους τρόπους που γνωρίζω για να προστατεύσω το αναγνωριστικό περιόδου λειτουργίας στην PHP.

Χρήση cookie Από προεπιλογή, όλες οι πληροφορίες περιόδου λειτουργίας, συμπεριλαμβανομένου του αναγνωριστικού, αποστέλλονται σε ένα cookie. Αλλά αυτό δεν συμβαίνει πάντα. Ορισμένοι χρήστες απενεργοποιούν τα cookies στα προγράμματα περιήγησής τους. Σε αυτήν την περίπτωση, το πρόγραμμα περιήγησης θα μεταβιβάσει το αναγνωριστικό περιόδου σύνδεσης στη διεύθυνση URL.

Εδώ το αναγνωριστικό μεταδίδεται σε καθαρό κείμενο, σε αντίθεση με μια περίοδο λειτουργίας μέσω ενός cookie, όταν οι πληροφορίες είναι κρυμμένες στην κεφαλίδα HTTP. Ο απλούστερος τρόπος προστασίας από αυτό θα ήταν να απαγορεύσετε τη μετάδοση του αναγνωριστικού της περιόδου σύνδεσης μέσω της γραμμής διευθύνσεων. Αυτό μπορεί να γίνει γράφοντας τα ακόλουθα στο αρχείο διαμόρφωσης διακομιστή Apache .htaccess:

Php_flag session.use_only_cookies

Χρήση κρυπτογράφησης Εάν ο ιστότοπός σας πρέπει να επεξεργαστεί ευαίσθητες πληροφορίες, όπως αριθμούς πιστωτικών καρτών (γεια σας από τη Sony), θα πρέπει να χρησιμοποιήσετε κρυπτογράφηση SSL3.0 ή TSL1.0. Για να γίνει αυτό, όταν ορίζετε ένα cookie, πρέπει να καθορίσετε true για την ασφαλή παράμετρο.

Εάν αποθηκεύετε τον κωδικό της συνεδρίας στη μεταβλητή $_SESSION (είναι ακόμα καλύτερο να χρησιμοποιήσετε sql), τότε δεν θα πρέπει να τον αποθηκεύσετε σε καθαρό κείμενο.

Εάν ($_SESSION["password"] == $userpass) ( // κωδικός )

Ο παραπάνω κωδικός δεν είναι ασφαλής επειδή ο κωδικός πρόσβασης αποθηκεύεται ως απλό κείμενο σε μια μεταβλητή συνεδρίας. Αντ 'αυτού, χρησιμοποιήστε κρυπτογράφηση md5, κάτι σαν αυτό:

Αν ($_SESSION["md5password"] == md5($userpass)) ( // κωδικός )

Έλεγχος προγράμματος περιήγησης Για να αποτρέψετε τη δυνατότητα χρήσης μιας περιόδου λειτουργίας από άλλο πρόγραμμα περιήγησης (υπολογιστή), πρέπει να εισαγάγετε έναν έλεγχο του πεδίου κεφαλίδας του παράγοντα χρήστη HTTP:

Session_start(); if (isset($_SESSION["HTTP_USER_AGENT"])) ( if ($_SESSION["HTTP_USER_AGENT"] != md5($_SERVER["HTTP_USER_AGENT"])) ( // κωδικός ) ) other ($_SESSION["HTTP_USER_USER_USER" ] = md5($_SERVER["HTTP_USER_AGENT"]); )

Λήξη περιόδου λειτουργίας Περιορίστε τη διάρκεια ζωής της συνεδρίας, καθώς και το χρόνο λήξης των cookies. Από προεπιλογή, η διάρκεια της συνεδρίας είναι 1440 δευτερόλεπτα. Μπορείτε να αλλάξετε αυτήν την τιμή μέσω των php.ini και .htaccess. Παράδειγμα για .htaccess:

# Διάρκεια συνεδρίας σε δευτερόλεπτα
php_value session.gc_maxlifetime 3600
# Διάρκεια ζωής cookie σε δευτερόλεπτα
php_value session.cookie_lifetime 3600

Δέσμευση με διεύθυνση IP Σε ορισμένες περιπτώσεις (όχι πάντα), θα πρέπει να δεσμεύεστε με διεύθυνση IP. Κυρίως όταν ο αριθμός των χρηστών είναι περιορισμένος και έχει στατικές IP. Ο έλεγχος μπορεί να βασίζεται είτε στη λίστα των επιτρεπόμενων διευθύνσεων IP,

Include("ip_list.php"); //$ip_white_list = πίνακας ("admin1" => "111.222.333.444", "admin2" => "555.666.777.888"); if(!empty(array_search($_SERVER["REMOTE_ADDR"],$ip_white_list))) ( header("Location: admin.php"); ) else (echo "ΑΠΟΡΡΙΨΗ ΠΡΟΣΒΑΣΗΣ!"; )

Ή με διεύθυνση IP για κάθε αίτημα (μόνο για στατική IP):

If(isset($_SESSION["ip"]) και $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"]) ( header("Location: admin.php"); ) else ( session_unset(); $ _SESSION["ip"] = $_SERVER["REMOTE_ADDR"]; )

Θα πρέπει να γνωρίζετε ότι το hacking δεν μπορεί να αποφευχθεί εντελώς. Μπορείτε να κάνετε αυτό το hack όσο το δυνατόν πιο δύσκολο μόνο με οποιοδήποτε γνωστό μέσο. Ωστόσο, δεν πρέπει επίσης να ξεχνάτε τους νόμιμους χρήστες σας, ώστε να μην περιπλέκετε τη ζωή τους με τέτοια προστασία.

Αυτό το άρθρο γράφτηκε το 2009 και παραμένει μια από τις πιο δημοφιλείς αναρτήσεις μας. Αν θέλετε να μάθετε περισσότερα για την PHP και τη MySQL, μπορεί να το βρείτε με μεγάλο ενδιαφέρον.

ΣΗΜΕΙΩΣΗ: Αυτό το άρθρο έχει πρόσφατα ενημερωθεί για να λειτουργεί σε PHP 4.2 ή νεότερη έκδοση!

Πρόσφατα, είχα την ευκαιρία να δουλέψω σε ένα μικρό έργο με μια ομάδα ανθρώπων. Είχαμε αποφασίσει από νωρίς ότι αυτό το email από μόνο του δεν επρόκειτο να είναι αρκετό για να κρατήσει τους πάντες ενήμερους, οπότε μου ανατέθηκε η κατασκευή ενός μικρού ιστότοπου για το έργο. Θα περιέχει έναν απλό πίνακα μηνυμάτων, ένα μέρος όπου θα μπορούσαμε να ανεβάσουμε έγγραφα και άλλα αρχεία για χρήση από την υπόλοιπη ομάδα και στοιχεία επικοινωνίας για τα διάφορα μέλη της ομάδας.

Για να λειτουργήσουν πολλές από αυτές τις λειτουργίες, ήξερα ότι θα χρειαζόμουν τους χρήστες να συνδεθούν πριν αποκτήσουν πρόσβαση στα σχετικά μέρη του ιστότοπου. Αυτό που χρειαζόμουν ήταν ένα σύστημα που θα επέτρεπε στους χρήστες να εγγραφούν για ένα αναγνωριστικό χρήστη για πρόσβαση στον ιστότοπο και στη συνέχεια να χρησιμοποιήσουν αμέσως αυτό το αναγνωριστικό χωρίς καμία παρέμβαση από μέρους μου.

Σε αυτό το άρθρο, θα παράσχω μια επισκόπηση του συστήματος που ανέπτυξα, ξεκινώντας από το πρώτο εξάμηνο με τη διαδικασία εγγραφής χρήστη. Στο δεύτερο εξάμηνο, θα επικεντρωθώ στον ίδιο τον ιστότοπο, πώς απαιτεί από τους χρήστες να συνδεθούν και στη συνέχεια να διατηρήσουν αυτήν την κατάσταση σύνδεσης καθ' όλη τη διάρκεια της επίσκεψής τους. Θα δώσω ιδιαίτερη προσοχή στη χρήση των δυνατοτήτων διαχείρισης συνεδρίας στην PHP. Στο τέλος, θα πρέπει να έχετε όλες τις πληροφορίες που χρειάζεστε για να εφαρμόσετε ένα παρόμοιο δικό σας σύστημα.

Σε όλο αυτό το άρθρο, θα υποθέσω ότι έχετε μια βασική εξοικείωση με τη γλώσσα PHP, τη χρήση φορμών για την υποβολή πληροφοριών σε ένα σενάριο PHP και πώς μπορεί να χρησιμοποιηθεί η PHP για την αλληλεπίδραση με μια βάση δεδομένων MySQL. Εάν κάποια από αυτές είναι ξένες έννοιες για εσάς, θα πρέπει να ξεκινήσετε διαβάζοντας το προηγούμενο άρθρο μου, .

Μέρος πρώτο: Η διαδικασία εγγραφής Η φόρμα εγγραφής

Ένα φυσικό μέρος για να ξεκινήσετε τη δημιουργία ενός ιστότοπου που θα απαιτεί από τους χρήστες να εγγραφούν για πρόσβαση είναι η ίδια η διαδικασία εγγραφής. Όπως θα περίμενε κανείς, μια απλή φόρμα που βασίζεται στο Web θα κάνει το κόλπο. Δείτε πώς θα μοιάζει:

Και εδώ είναι ο κώδικας αυτής της φόρμας:




Εγγραφή Νέου Χρήστη



Φόρμα εγγραφής νέου χρήστη

* υποδηλώνει απαιτούμενο πεδίο


Με τον στόχο πλέον ξεκάθαρο, θα σας καθοδηγήσω στον κώδικα για το accesscontrol.php . Ξεκινήστε συμπεριλαμβάνοντας τα δύο εύχρηστα αρχεία σας: