Λογαριασμός επικοινωνίας php. Δημιουργία ενός απίστευτα απλού συστήματος εγγραφής σε PHP και MySQL

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

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

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

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

  1. Δημιουργήστε μια φόρμα εγγραφής για HTML.
  2. Λάβετε δεδομένα από τη φόρμα στο σενάριο χειρισμού.
  3. Ελέγξτε τα ληφθέντα δεδομένα και εάν είναι λανθασμένα, κατευθυνθείτε ξανά στη φόρμα εγγραφής.
  4. Εάν τα δεδομένα είναι σωστά, τότε γράψτε τα στη βάση δεδομένων.

Αυτή είναι η όλη διαδικασία εγγραφή χρήστη στον ιστότοπο. Δηλαδή, η εγγραφή είναι η αποθήκευση πληροφοριών σχετικά με τον χρήστη στον ιστότοπο.

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

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

  1. Δημιουργήστε μια φόρμα εξουσιοδότησης χρήστη στο HTML, όπου ο χρήστης θα πρέπει να εισάγει τα στοιχεία σύνδεσης και τον κωδικό πρόσβασής του.
  2. Στο σενάριο χειρισμού, αποδεχτείτε δεδομένα από τον χρήστη. Εάν με ακούσατε και αποθηκεύσατε κρυπτογραφημένους κωδικούς πρόσβασης σε μια βάση δεδομένων, τότε πρώτα κρυπτογραφήστε τον κωδικό πρόσβασης που λάβατε. Εάν υπάρχουν σαφείς κωδικοί πρόσβασης στη βάση δεδομένων, τότε δεν χρειάζεται να τους κρυπτογραφήσετε.
  3. Βεβαιωθείτε ότι τα δεδομένα που εισαγάγατε είναι σωστά και εάν τα στοιχεία σύνδεσης και ο κωδικός πρόσβασης ταιριάζουν υπάρχων χρήστηςστη βάση δεδομένων και, στη συνέχεια, γράψτε στο κουλουράκιή πληροφορίες συνεδρίας με σύνδεση και κρυπτογραφημένο κωδικό πρόσβασης (ή ανοίξτε τον κωδικό πρόσβασης, αν δεν το κρυπτογραφήσατε).
  4. Εάν τα στοιχεία σύνδεσης και/ή ο κωδικός πρόσβασης έχουν εισαχθεί λανθασμένα, τότε ανακατευθυνθείτε πίσω στη φόρμα εξουσιοδότησης.

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

Και κάτι τελευταίο. Πώς φτιάχνεται το κουμπί Εξοδος"; Πολύ απλό. Όταν πατάτε αυτό το κουμπί, το κουλουράκι, ή συνεδρία. Έτσι, ο χρήστης αποβάλλεται αυτόματα από τον ιστότοπο.

Όπως μπορείτε να δείτε, όλα είναι στοιχειώδη, αλλά κατά την εφαρμογή αυτού του αλγόριθμου θα έχετε σίγουρα πολλές ερωτήσεις. Για παράδειγμα, τι πρέπει να κάνετε κατά την εγγραφή ενός χρήστη του οποίου η σύνδεση είναι ήδη στη βάση δεδομένων. Υλοποίηση διαφόρων ελέγχων εισροών, υλοποίηση ελέγχου ύπαρξης ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗκαι ούτω καθεξής - όλα αυτά είναι αρκετά δύσκολα αν το κάνετε για πρώτη φορά. Ωστόσο, έδωσα τον χυμό. Εάν έχετε ερωτήσεις κατά την εφαρμογή, ρωτήστε είτε στο φόρουμ είτε στα σχόλια.

Έτσι, υπάρχει ένα καθήκον - να κάνετε εγγραφή στο σύστημα και τη δυνατότητα εξουσιοδότησης. Πως να το κάνεις; Ας ξεκινήσουμε με τη σειρά.

Εγγραφή σε php

Όλα είναι απλά εδώ. Δημιουργείται μια αποθήκη δεδομένων για τους χρήστες. Συνήθως αυτός είναι ένας πίνακας βάσης δεδομένων. Περιλαμβάνει πεδία όπως αναγνωριστικό, όνομα χρήστη και κωδικός πρόσβασης. Τα υπόλοιπα πεδία είναι προαιρετικά. Μπορείτε να συλλέξετε τα e-mail των χρηστών, τις διευθύνσεις τους, πιθανές IP, χρόνο πρόσβασης στο δίκτυο, κωδικές λέξεις από τραπεζικές κάρτες, ερωτήσεις ασφαλείας...

Γενικά, το κύριο πράγμα είναι το ζεύγος σύνδεσης-κωδικού πρόσβασης.

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

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

Η MySQL και η php έχουν τα ίδια κοινά και ασφαλής λειτουργίακατακερματισμός - md5. Αυτός ο αλγόριθμος λαμβάνει δεδομένα και δίνει ένα δακτυλικό αποτύπωμα.

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

INSERT INTO `users` (`id`,`username`,`password`) VALUES("",$quoted_username,MD5($quoted_password));

Λάβετε υπόψη ότι ονόμασα συγκεκριμένα τις μεταβλητές $quoted_ γιατί πριν τις εισαγάγετε στο ερώτημα, πρέπει να διαφύγουν χρησιμοποιώντας τη συνάρτηση mysql_real_escape_string(). Δεδομένου ότι αυτή η συνάρτηση χρησιμοποιείται πολύ συχνά και είναι γραμμένη πολύ μεγάλη (αγαπώ τους αρχιτέκτονες PHP), προτείνω να την στριμώξετε στο κέλυφός σας. Για παράδειγμα, όπως αυτό:

Συνάρτηση quote($var) (επιστροφή mysql_real_escape_string($var); )

Εξουσιοδότηση σε php

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

SELECT * FROM `users` WHERE `login`=$qoted_login AND `password`=MD5($quoted_password);

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

Θυμηθείτε χρήστη

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

Αλλά αυτή είναι μια κακή πρακτική. Γιατί; Επειδή ένα cookie είναι ένα αρχείο που αποθηκεύεται στο πρόγραμμα περιήγησης του χρήστη και τα δεδομένα από αυτό το αρχείο μεταδίδονται στον διακομιστή σε κάθε αίτημα. Πρώτον, μεταδίδονται ως κείμενο, πράγμα που σημαίνει ότι είναι εύκολο να υποκλαπούν. Δεύτερον, πρόκειται για απλό κείμενο που αποστέλλεται από τον χρήστη. Επομένως, μπορεί κυριολεκτικά να ξαναγραφτεί. Για παράδειγμα, εάν αποφασίσουμε να αποθηκεύσουμε το όνομα χρήστη "Vasya" σε cookies, μπορεί να ανοίξει τη διαχείριση cookie στο πρόγραμμα περιήγησής του, να βρει το επιθυμητό cookieκαι διορθώστε το σε, ας πούμε, "Διαχειριστής". Αυτό είναι όλο. Τώρα, με κάθε αίτημα, θα λαμβάνουμε ένα cookie, το οποίο θα μας λέει το όνομα χρήστη του χρήστη - «Διαχειριστής».

Επομένως, είναι ασφαλέστερο να αποθηκεύονται όλα τα δεδομένα στον διακομιστή σε μέρος που δεν είναι προσβάσιμο από τον Ιστό. Σε κάποιο φάκελο που δεν είναι δυνατή η πρόσβαση από το πρόγραμμα περιήγησης. Όλα τα δεδομένα σχετικά με τον χρήστη θα πρέπει να γράφονται σε αυτόν τον φάκελο και να διαβάζονται από εκεί κάθε φορά που ζητά ένα έγγραφο. Για να μάθετε ποιος χρήστης κατέχει ποιο αρχείο δεδομένων, πρέπει να ονομάσετε το αρχείο με μοναδικό όνομα και να ρίξετε αυτό το όνομα στα cookie του χρήστη. Έτσι, ο χρήστης δεν θα μπορεί να μάθει το όνομα του αρχείου για τον χρήστη Διαχειριστή - αυτό το αρχείο δημιουργείται από το σύστημα στον διακομιστή. Και αυτό σας επιτρέπει να σύρετε κωδικούς πρόσβασης σε καθαρό κείμενο από έγγραφο σε έγγραφο.

Αυτό που περιέγραψα είναι μηχανισμός συνεδρίας. Στην Perl, για παράδειγμα, για να χρησιμοποιήσετε συνεδρίες πρέπει να φορτώσετε ενότητες. Και στο συνεδρίες phpυποστηρίζεται από το κουτί. Στην πραγματικότητα, το μόνο που χρειάζεται να γνωρίζετε είναι η συνάρτηση session_start() και ο πίνακας $_SESSION. Αυτά είναι όλα. Θα σου πω τώρα.

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

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

$_SESSION["userid"] = $πληροφορίες χρήστη["id"];

Ολα. Τώρα, κάθε φορά που ένας χρήστης ζητά ένα σενάριο που χρησιμοποιεί περιόδους σύνδεσης, η τιμή του στοιχείου $_SESSION["userid"] θα είναι διαθέσιμη σε εσάς.

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

Μάθετε εάν ο χρήστης είναι εξουσιοδοτημένος

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

If(isset($_SESSION["userid"])) (εκτύπωση "ο χρήστης είναι εξουσιοδοτημένος"; )

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

Λοιπόν, προφανώς - κάντε ένα ερώτημα στον πίνακα χρηστών. Έχουμε επίσης το αναγνωριστικό αυτού του χρήστη.

SELECT * FROM `users` WHERE `id`=$quoted_userid

Πώς να αποσυνδεθείτε από έναν χρήστη και να αποσυνδεθείτε

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

Unset($_SESSION["userid"]);

Μπορείτε επίσης να σκοτώσετε τη συνεδρία για να είστε σίγουροι. Αυτό θα διαγράψει το cookie του χρήστη και θα καταστρέψει το αρχείο συνεδρίας στον διακομιστή. Σε αυτήν την περίπτωση, όλα τα δεδομένα θα χαθούν από αυτό. Γίνεται ως εξής:

Session_destroy();

Αυτό είναι όλο. Εάν έχετε οποιεσδήποτε ερωτήσεις, μη διστάσετε να επικοινωνήσετε μαζί μας. Επιπλέον, μπορείτε να επικοινωνήσετε μαζί μου μέσω icq ή mail και να ζητήσετε βοήθεια για κάτι. Συνήθως δεν αρνούμαι. Εάν χρειάζεστε σοβαρή βοήθεια, μπορώ να ζητήσω μια μικρή πληρωμή. Επιπλέον, μπορώ να σας μάθω πώς να φτιάχνετε ιστοσελίδες από απόσταση! Αυτός είναι ο τύπος του προπονητή και του γκουρού που είμαι :) Και αν θέλετε να λαμβάνετε μαθήματα και κόλπα ακριβώς έτσι, δωρεάν, εγγραφείτε στο RSS του ιστολογίου μου.

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

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

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

PHP

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

User.class.php

// Ιδιωτική παρουσία ORM
ιδιωτική $orm;

/**
* Βρείτε έναν χρήστη με συμβολοσειρά διακριτικού. Λαμβάνονται μόνο έγκυρα διακριτικά
* εκτίμηση. Ένα διακριτικό ισχύει για 10 λεπτά μετά τη δημιουργία του.
* @param string $token Το διακριτικό για αναζήτηση
* @return Χρήστης
*/

Δημόσια στατική συνάρτηση findByToken($token)(

// Βρείτε το στη βάση δεδομένων και βεβαιωθείτε ότι η χρονική σήμανση είναι σωστή


->where ("token", $token)
->where_raw("token_validity > NOW()")
->find_one();

Αν(!$result)(
επιστροφή ψευδής?
}

Επιστροφή νέου χρήστη ($result);
}

/**
* Είτε συνδεθείτε είτε εγγραφείτε χρήστη.
* @return Χρήστης
*/

Δημόσια στατική συνάρτηση loginOrRegister($email)(

// Εάν υπάρχει ήδη ένας τέτοιος χρήστης, επιστρέψτε τον

If(User::exists($email))(
επιστροφή νέου χρήστη ($email);
}

// Διαφορετικά, δημιουργήστε το και επιστρέψτε το

Επιστροφή χρήστη::create($email);
}

/**
* Δημιουργήστε έναν νέο χρήστη και αποθηκεύστε τον στη βάση δεδομένων
* @param string $email Η διεύθυνση email του χρήστη
* @return Χρήστης
*/

Ιδιωτική στατική συνάρτηση δημιουργία($email)(

// Γράψτε έναν νέο χρήστη στη βάση δεδομένων και επιστρέψτε τον

$result = ORM::for_table("reg_users")->create();
$result->email = $email;
$result->save();

Επιστροφή νέου χρήστη ($result);
}

/**
* Ελέγξτε εάν υπάρχει ένας τέτοιος χρήστης στη βάση δεδομένων και επιστρέψτε ένα boolean.
* @param string $email Η διεύθυνση email του χρήστη
* @return boolean
*/

Υπάρχει δημόσια στατική συνάρτηση($email)(

// Υπάρχει ο χρήστης στη βάση δεδομένων;
$result = ORM::for_table("reg_users")
->where ("email", $email)
->count();

Επιστροφή $result == 1;
}

/**
* Δημιουργήστε ένα νέο αντικείμενο χρήστη
* @param $param παράδειγμα ORM, id, email ή null
* @return Χρήστης
*/

Δημόσια συνάρτηση __construct($param = null)(

If($param instanceof ORM)(

// Ένα στιγμιότυπο ORM πέρασε
$this->orm = $param;
}
else if(is_string($param))(

// Έγινε αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου
$αυτό->
->where ("email", $param)
->find_one();
}
αλλού(

If(is_numeric($param))(
// Ένα αναγνωριστικό χρήστη μεταβιβάστηκε ως παράμετρος
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Δεν μεταβιβάστηκε κανένα αναγνωριστικό χρήστη, κοιτάξτε τη συνεδρία
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->where("id", $id)
->find_one();
}

/**
* Δημιουργεί ένα νέο διακριτικό σύνδεσης SHA1, το γράφει στη βάση δεδομένων και το επιστρέφει.
* @return string
*/

Δημόσια συνάρτηση generateToken())(
// δημιουργεί ένα διακριτικό για τον συνδεδεμένο χρήστη. Αποθηκεύστε το στη βάση δεδομένων.

$token = sha1($this->email.time().rand(0, 1000000));

// Αποθηκεύστε το διακριτικό στη βάση δεδομένων,
// και σημειώστε το ως έγκυρο μόνο για τα επόμενα 10 λεπτά

$this->orm->set("token", $token);
$this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")");
$this->orm->save();

Επιστροφή $token;
}

/**
*Συνδεθείτε σε αυτόν τον χρήστη
* @return κενό
*/

Είσοδος δημόσιας λειτουργίας ()

// Επισήμανση του χρήστη ως συνδεδεμένου
$_SESSION["loginid"] = $this->orm->id;

// Ενημερώστε το πεδίο db last_login
$this->orm->set_expr("last_login", "NOW()");
$this->orm->save();
}

/**
* Καταστρέψτε τη συνεδρία και αποσυνδεθείτε από τον χρήστη.
* @return κενό
*/

Αποσύνδεση δημόσιας συνάρτησης()
$_SESSION = array();
unset($_SESSION);
}

/**
* Ελέγξτε εάν ο χρήστης είναι συνδεδεμένος.
* @return boolean
*/

Δημόσια συνάρτηση logedIn())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Ελέγξτε εάν ο χρήστης είναι διαχειριστής
* @return boolean
*/

Δημόσια λειτουργία isAdmin())(
return $this->rank() == "διαχειριστής";
}

/**
* Βρείτε τον τύπο χρήστη. Μπορεί να είναι είτε admin είτε κανονικό.
* @return string
*/

Κατάταξη δημόσιας λειτουργίας ()
if($this->orm->rank == 1)(
επιστροφή "διαχειριστής"?
}

Επιστροφή "κανονική"?
}

/**
* Μαγική μέθοδος πρόσβασης στα στοιχεία του ιδιωτικού
* Το παράδειγμα $orm ως ιδιότητες του αντικειμένου χρήστη
* @param string $key Το όνομα της ιδιότητας στην οποία έχετε πρόσβαση
* @return μικτή
*/

Δημόσια συνάρτηση __get($key)(
if(isset($this->orm->$key))(
επιστροφή $this->orm->$key;
}

Επιστροφή null.
}
}
Τα διακριτικά δημιουργούνται χρησιμοποιώντας έναν αλγόριθμο και αποθηκεύονται σε μια βάση δεδομένων. Χρησιμοποιούμε MySQL για να ορίσουμε τη στήλη token_validity σε 10 λεπτά. Κατά την επικύρωση ενός διακριτικού, λέμε στον κινητήρα ότι χρειαζόμαστε ένα διακριτικό, το πεδίο token_validity δεν έχει ακόμη λήξει. Με αυτόν τον τρόπο περιορίζουμε το χρόνο κατά τον οποίο θα ισχύει το διακριτικό.

Παρατηρήστε ότι χρησιμοποιούμε τη μαγική μέθοδο __get() στο τέλος του εγγράφου για πρόσβαση στις ιδιότητες του αντικειμένου χρήστη. Αυτό μας επιτρέπει να έχουμε πρόσβαση σε δεδομένα που είναι αποθηκευμένα στη βάση δεδομένων ως ιδιότητες: $user->email, $user->token. Για παράδειγμα, ας δούμε πώς μπορούμε να χρησιμοποιήσουμε αυτήν την κλάση στο ακόλουθο απόσπασμα κώδικα:


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

Functions.php

Συνάρτηση send_email($from, $to, $subject, $message)(

// Λειτουργία βοήθειας για αποστολή email

$headers = "MIME-Έκδοση: 1.0" . "\r\n";
$headers .= "Content-type: text/plain; charset=utf-8" . "\r\n";
$headers .= "Από: ".$from . "\r\n";

Επιστροφή αλληλογραφίας ($to, $subject, $message, $headers);
}

συνάρτηση get_page_url())(

// Μάθετε τη διεύθυνση URL ενός αρχείου PHP

$url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://".$_SERVER["SERVER_NAME"];

If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER["REQUEST_URI"];
}
αλλού(
$url.= $_SERVER["PATH_INFO"];
}

Επιστροφή $url;
}

συνάρτηση rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)(

// Ο αριθμός των προσπαθειών σύνδεσης για την τελευταία ώρα από αυτήν τη διεύθυνση IP

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts > SUBTIME(NOW(),"1:00")")
->count();

// Ο αριθμός των προσπαθειών σύνδεσης για τα τελευταία 10 λεπτά από αυτήν τη διεύθυνση IP

$count_10_min = ORM::for_table("reg_login_ttempt")
->where("ip", sprintf("%u", ip2long($ip)))
->where_raw("ts > SUBTIME(NOW(),"0:10")")
->count();

If($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
ρίχνει νέα Εξαίρεση ("Πάρα πολλές προσπάθειες σύνδεσης!");
}
}

συνάρτηση rate_limit_tick($ip, $email)(

// Δημιουργία νέας εγγραφής στον πίνακα προσπάθειας σύνδεσης

$login_attempt = ORM::for_table("reg_login_attempt")->create();

$login_attempt->email = $email;
$login_attempt->ip = sprintf("%u", ip2long($ip));

$login_attempt->save();
}

ανακατεύθυνση συνάρτησης($url)(
header("Τοποθεσία: $url");
έξοδος;
}
Οι συναρτήσεις rate_limit και rate_limit_tick μας επιτρέπουν να περιορίσουμε τον αριθμό των προσπαθειών εξουσιοδότησης για μια συγκεκριμένη χρονική περίοδο. Οι προσπάθειες εξουσιοδότησης καταγράφονται στη βάση δεδομένων reg_login_attempt. Αυτές οι λειτουργίες ενεργοποιούνται όταν επαληθευτεί η φόρμα σύνδεσης, όπως μπορείτε να δείτε στο παρακάτω απόσπασμα κώδικα.

Ο παρακάτω κώδικας ελήφθη από το index.php και είναι υπεύθυνος για την επικύρωση της φόρμας σύνδεσης. Επιστρέφει μια απάντηση JSON που καθοδηγείται από τον κώδικα jQuery που είδαμε στο assets/js/script.js.

index.php

If(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// Εξαγωγή κεφαλίδας JSON

Header("Content-type: application/json");

// Είναι έγκυρη η διεύθυνση email;

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
ρίχνει νέα Εξαίρεση ("Παρακαλώ εισάγετε ένα έγκυρο email.");
}

// Αυτό θα δημιουργήσει μια εξαίρεση εάν το άτομο είναι παραπάνω
// τα επιτρεπόμενα όρια προσπάθειας σύνδεσης (δείτε το functions.php για περισσότερα):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Καταγράψτε αυτήν την προσπάθεια σύνδεσης
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]);

// Στείλε τομήνυμα στον χρήστη

$message = "";
$email = $_POST["email"];
$subject = "Ο σύνδεσμος σύνδεσής σας";

Εάν(!Χρήστης::υπάρχει($email))(
$subject = "Σας ευχαριστούμε για την εγγραφή!";
$message = "Σας ευχαριστούμε για την εγγραφή στον ιστότοπό μας!\n\n";
}

// Προσπαθήστε να συνδεθείτε ή να εγγράψετε το άτομο
$user = Χρήστης::loginOrRegister($_POST["email"]);

$message.= "Μπορείτε να συνδεθείτε από αυτήν τη διεύθυνση URL:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Ο σύνδεσμος θα λήξει αυτόματα μετά από 10 λεπτά.";

$result = send_email($fromEmail, $_POST["email"], $subject, $message);

Αν(!$result)(
ρίχνει νέα Εξαίρεση ("Παρουσιάστηκε σφάλμα κατά την αποστολή του email σας. Παρακαλώ προσπάθησε ξανά.");
}

Die(json_encode(array(
"message" => "Ευχαριστούμε! Έχουμε στείλει έναν σύνδεσμο στα εισερχόμενά σας. Ελέγξτε επίσης τον φάκελο ανεπιθύμητων μηνυμάτων."
)));
}
}
catch(Εξαίρεση $e)(

Die(json_encode(array(
"error"=>1,
"message" => $e->getMessage()
)));
}
Μετά την επιτυχή εξουσιοδότηση ή εγγραφή, ο παραπάνω κωδικός στέλνει ένα email στο άτομο με έναν σύνδεσμο για εξουσιοδότηση. Το διακριτικό διατίθεται ως μεταβλητή $_GET "tkn" λόγω της διεύθυνσης URL που δημιουργείται.

index.php

If(isset($_GET["tkn"]))(

// Είναι αυτό ένα έγκυρο διακριτικό σύνδεσης;
$user = Χρήστης::findByToken($_GET["tkn"]);

// Ναί! Συνδεθείτε στο χρήστη και ανακατευθυνθείτε στην προστατευμένη σελίδα.

$user->login();
redirect("protected.php");
}

// Μη έγκυρο διακριτικό. Ανακατεύθυνση πίσω στη φόρμα σύνδεσης.
ανακατεύθυνση ("index.php");
}
Η εκτέλεση της $user->login() θα δημιουργήσει τις απαραίτητες μεταβλητές περιόδου λειτουργίας, επιτρέποντας στον χρήστη να παραμείνει συνδεδεμένος στις επόμενες συνδέσεις.

Η αποσύνδεση από το σύστημα υλοποιείται με τον ίδιο περίπου τρόπο:

Ευρετήριο.php

If(isset($_GET["logout"]))(

$user = νέος χρήστης();

If($user->loggedIn())(
$user->logout();
}

Ανακατεύθυνση ("index.php");
}
Στο τέλος του κώδικα, ανακατευθύνουμε ξανά τον χρήστη στο index.php, οπότε η παράμετρος ?logout=1 στη διεύθυνση URL εξαλείφεται.

Το αρχείο μας index.php θα χρειαστεί επίσης προστασία - δεν θέλουμε οι ήδη συνδεδεμένοι χρήστες να βλέπουν τη φόρμα. Για να το κάνουμε αυτό χρησιμοποιούμε τη μέθοδο $user->loggedIn():

Ευρετήριο.php

$user = νέος χρήστης();

if($user->loggedIn())(
redirect("protected.php");
}
Τέλος, ας δούμε πώς μπορείτε να προστατεύσετε τη σελίδα του ιστότοπού σας και να την κάνετε προσβάσιμη μόνο μετά από εξουσιοδότηση:

προστατευμένο.php

// Για να προστατεύσετε οποιαδήποτε σελίδα php στον ιστότοπό σας, συμπεριλάβετε το main.php
// και δημιουργήστε ένα νέο αντικείμενο χρήστη. Είναι τόσο απλό!

require_once "includes/main.php";

$user = νέος χρήστης();

if(!$user->loggedIn())(
ανακατεύθυνση ("index.php");
}
Μετά από αυτόν τον έλεγχο, μπορείτε να είστε βέβαιοι ότι ο χρήστης έχει συνδεθεί με επιτυχία. Θα έχετε επίσης πρόσβαση σε δεδομένα που είναι αποθηκευμένα στη βάση δεδομένων ως ιδιότητες του αντικειμένου $user. Για να εμφανίσετε το email του χρήστη και την κατάταξή του, χρησιμοποιήστε τον ακόλουθο κώδικα:

Echo "Το email σας: ".$user->email;
echo "Η κατάταξη σας: ".$user->rank();
Εδώ η rank() είναι η μέθοδος επειδή η στήλη κατάταξης στη βάση δεδομένων περιέχει συνήθως αριθμούς (0 για κανονικούς χρήστες και 1 για διαχειριστές) και πρέπει να μετατρέψουμε όλους αυτούς σε ονόματα κατάταξης, κάτι που υλοποιείται χρησιμοποιώντας αυτήν τη μέθοδο. Μετατρέπω τακτικός χρήστηςως διαχειριστής, απλώς επεξεργαστείτε την καταχώριση χρήστη στο phpmyadmin (ή σε οποιοδήποτε άλλο πρόγραμμα βάσης δεδομένων). Ως διαχειριστής, ο χρήστης δεν θα έχει ειδικές δυνατότητες. Εσείς έχετε το δικαίωμα να επιλέξετε ποια δικαιώματα θα παραχωρήσετε στους διαχειριστές.

Ετοιμος!

Με αυτό το απλό σύστημα εγγραφής μας είναι έτοιμο! Μπορείτε να το χρησιμοποιήσετε σε έναν υπάρχοντα ιστότοπο PHP ή να τον εκσυγχρονίσετε ώστε να ταιριάζει στις δικές σας απαιτήσεις.

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

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

Εν συντομία, όλες οι εργασίες με συνεδρίες μπορούν να χωριστούν σε 3 στάδια:

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

Καταχώρηση μεταβλητών συνεδρίας.

Κατάργηση καταχώρισης μεταβλητών συνεδρίας χρησιμοποιώντας τη συνάρτηση unset() και κλείσιμο της συνεδρίας με τη συνάρτηση session_destroy().

Βήμα 1

Έτσι, για τη δουλειά μας θα δημιουργήσουμε 3 αρχεία - Αρχική σελίδα(index.php), Επαφές (contact.php) και Admin (admin.php). Λάβετε υπόψη ότι η επέκταση αρχείου στην οποία θα περιορίσουμε την πρόσβαση θα πρέπει να είναι .php. Όπως μαντέψατε, θα περιορίσουμε την πρόσβαση στο αρχείο admin.php. Ο κώδικας για όλα τα αρχεία είναι ο απλούστερος - είναι ένα είδος μενού σε μια γραμμή με συνδέσμους προς άλλες σελίδες και κάτω από αυτό το μεμονωμένο κείμενο κάθε σελίδας, ώστε να μπορούμε να τις ξεχωρίζουμε μεταξύ τους. Εδώ, για παράδειγμα, είναι ο κώδικας για τη σελίδα ευρετηρίου:

Αρχική σελίδα | Επαφές | διαχειριστής


Αυτή είναι η κύρια σελίδα

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

Βήμα 2

Προς το παρόν, μπορούμε να πλοηγηθούμε ελεύθερα σε όλες τις σελίδες, συμπεριλαμβανομένης της σελίδας διαχειριστή. Πώς μπορούμε να περιορίσουμε την πρόσβαση σε αυτό; Πώς θα είναι ο αλγόριθμος; Θα κάνουμε το εξής: στην αρχή της σελίδας θα ελέγξουμε αν η ετικέτα που χρειαζόμαστε βρίσκεται στη συνεδρία ή, πιο απλά, εάν υπάρχει μια συγκεκριμένη μεταβλητή συνεδρίας (μπορούμε επίσης να ελέγξουμε αν η τιμή μιας μεταβλητής συνεδρίας είναι ίση με μια ορισμένη τιμή). Εάν δεν υπάρχει τέτοια μεταβλητή, τότε ο χρήστης που ζητά αυτήν τη σελίδα δεν είναι εξουσιοδοτημένος, πράγμα που σημαίνει ότι θα τον ανακατευθύνουμε στη σελίδα εξουσιοδότησης, όπου θα του ζητηθεί να συμπληρώσει μια φόρμα με όνομα και κωδικό πρόσβασης. Ο αλγόριθμος είναι εξαιρετικά απλός - ας τον εφαρμόσουμε. Μεταβείτε στο αρχείο admin.php, ανοίξτε την κατασκευή PHP στην κορυφή και γράψτε τον ακόλουθο κώδικα:

session_start();

if (! $_SESSION [ "admin" ] ) (

header("Τοποθεσία: enter.php");

έξοδος ;

Ας διαβάσουμε τώρα αυτόν τον κώδικα. Πρώτον, ανοίξαμε μια συνεδρία, όπως θυμάστε - αυτό είναι απαραίτητη προϋπόθεση όταν εργάζεστε με συνεδρίες. Στη συνέχεια, δημιουργήσαμε μια απλή συνθήκη που μπορεί να διαβαστεί ως εξής: "εάν το στοιχείο διαχειριστή δεν υπάρχει στον πίνακα $_SESSION, θα εκτελέσουμε το μπλοκ ενεργειών που περικλείονται σε αγκύλες τελεστή." Και στο μπλοκ κώδικα, χρησιμοποιώντας τη συνάρτηση header(), ανακατευθύνουμε τον χρήστη στη σελίδα enter.php (αυτή είναι η σελίδα εξουσιοδότησης). Μετά τη συνάρτηση header(), πρέπει να ολοκληρώσουμε την εκτέλεση του σεναρίου χρησιμοποιώντας τη συνάρτηση exit(). Εάν η συνθήκη δεν πληρούται, δηλαδή, θα υπάρχει ένα στοιχείο διαχειριστή στον πίνακα $_SESSION, αυτό σημαίνει ότι ο χρήστης έχει ήδη εξουσιοδοτηθεί με επιτυχία και θα παραλείψουμε το μπλοκ ενεργειών στις αγκύλες τελεστή, δηλαδή δεν θα γίνει ανακατεύθυνση, και εμφανίζουμε τη σελίδα που ζητήσατε.

Βήμα 3

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

Αρχική σελίδα | Επαφές | διαχειριστής


Αυτή είναι η σελίδα σύνδεσης.
Όνομα χρήστη:
Κωδικός πρόσβασης:

< p > < a href = "index.php" >Σπίτι< / a > | < a href = "contact.php" >Επαφές< / a > | < a href = "admin.php" >διαχειριστής< / a > < / p >

< hr / >

< br / >

< form method = "post" >

Όνομα χρήστη:< input type = "text" name = "user" / > < br / >

Κωδικός πρόσβασης:< input type = "password" name = "pass" / > < br / >

< input type = "submit" name = "submit" value = "Να ερθει μεσα" / >

< / form >

Όλα είναι απλά εδώ. Η φόρμα έχει 2 πεδία: ένα πεδίο σύνδεσης (του δώσαμε το όνομα «χρήστης») και ένα πεδίο κωδικού πρόσβασης (με το όνομα «πάσο»). Δημιουργήσαμε επίσης ένα κουμπί (όνομα "υποβολή"), όταν πατηθεί, θα σταλούν δεδομένα από τη φόρμα. Τα δεδομένα αποστέλλονται χρησιμοποιώντας τη μέθοδο ανάρτησης - το έχουμε καθορίσει στο χαρακτηριστικό μέθοδος της ετικέτας φόρμας - και θα υποβληθούν σε επεξεργασία στην ίδια σελίδα. Τώρα μπορούμε να προσπαθήσουμε να μεταβούμε στη σελίδα διαχειριστή. Εάν όλα γίνονται χωρίς σφάλματα, δεν θα μπορούμε να φτάσουμε εκεί, αλλά θα καταλήγουμε πάντα στη σελίδα εξουσιοδότησης.

Φοβερο!

Βήμα 4

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

Έτσι, η σύνδεσή μας θα είναι "admin" και θα την αποθηκεύσουμε στη μεταβλητή $admin. Ο κωδικός πρόσβασης θα είναι "mypass" και θα αποθηκευτεί στη μεταβλητή $pass. Αλλά η αποθήκευση κωδικών πρόσβασης σε καθαρό κείμενο δεν γίνεται αποδεκτή - αυτό είναι αντίθετο με τις αρχές ασφαλείας. Θα αποθηκεύσουμε τον κωδικό πρόσβασης σε κρυπτογραφημένη μορφή και η συνάρτηση md5() θα μας βοηθήσει να τον κρυπτογραφήσουμε. Αυτή η συνάρτηση κρυπτογραφεί μια συμβολοσειρά χρησιμοποιώντας έναν ειδικό αλγόριθμο και η έξοδος είναι μια συμβολοσειρά 32 χαρακτήρων (που ονομάζεται κατακερματισμός). Εάν κρυπτογραφήσουμε τη συμβολοσειρά "mypass" (αυτό μπορεί να γίνει, για παράδειγμα, στο αρχείο contact.php):

echo md5 ("mypass");

τότε η έξοδος θα είναι η γραμμή "a029d0df84eb5549c641e04a9ef389e5″ - αυτός θα είναι ο κρυπτογραφημένος κωδικός μας. Προς το παρόν, ο κωδικός της σελίδας σύνδεσης θα είναι ως εξής:

Αρχική σελίδα | Επαφές | διαχειριστής


Αυτή είναι η σελίδα σύνδεσης.
Όνομα χρήστη:
Κωδικός πρόσβασης:

session_start();

$admin = "διαχειριστής" ;

$pass = "a029d0df84eb5549c641e04a9ef389e5";

< p > < a href = "index.php" >Σπίτι< / a > | < a href = "contact.php" >Επαφές< / a > | < a href = "admin.php" >διαχειριστής< / a > < / p >

< hr / >

< br / >

< form method = "post" >

Όνομα χρήστη:< input type = "text" name = "user" / > < br / >

Κωδικός πρόσβασης:< input type = "password" name = "pass" / > < br / >

< input type = "submit" name = "submit" value = "Να ερθει μεσα" / >

< / form >

Βήμα 5

Τώρα ας ελέγξουμε τι λάβαμε από τη φόρμα με αυτό που έχουμε στις μεταβλητές σύνδεσης και κωδικού πρόσβασης. Θα το κάνουμε αυτό υπό όρους - μόνο εάν πατηθεί το κουμπί φόρμας. Πώς μπορούμε να το ελέγξουμε αυτό; Το κουμπί έχει όνομα ("υποβολή") και μεταδίδουμε δεδομένα χρησιμοποιώντας τη μέθοδο ανάρτησης. Αντίστοιχα, μπορούμε απλά να ελέγξουμε εάν το στοιχείο υποβολής υπάρχει στον πίνακα $_POST. Εάν υπάρχει, πατήθηκε το κουμπί και θα εκτελέσουμε ενέργειες για την επαλήθευση των δεδομένων που αποστέλλονται, διαφορετικά δεν θα κάνουμε τίποτα. Αφού δηλώσουμε τη σύνδεση και τον κωδικό πρόσβασης, γράφουμε την προϋπόθεση:

if($_POST["υποβολή"])( if($admin == $_POST["user"] AND $pass == md5($_POST["pass"]))($_SESSION["admin"] = $ admin; header ("Τοποθεσία: admin.php");

Η σύνδεση ή ο κωδικός πρόσβασης είναι λάθος!

"; }

εάν ($_POST["υποβολή"]) (

if ($ admin == $_POST [ "user" ] AND $ pass == md5 ( $ _POST [ "pass" ] ) ) (

$_SESSION["admin"] = $admin;

έξοδος ;

) αλλιώς ηχώ "

Η σύνδεση ή ο κωδικός πρόσβασης είναι λάθος!

" ;

Θέσαμε την προϋπόθεση για τον έλεγχο της σύνδεσης και του κωδικού πρόσβασης διπλά. Αυτό γίνεται χρησιμοποιώντας τον λογικό τελεστή AND (μπορεί επίσης να γραφτεί με αυτόν τον τρόπο - "&&"). Η συνθήκη μπορεί να διαβαστεί ως εξής: "εάν (η μεταβλητή $admin είναι ίση με το στοιχείο χρήστη στον πίνακα $_POST ΚΑΙ η μεταβλητή $pass είναι ίση με τον κατακερματισμό του στοιχείου pass στον πίνακα $_POST) τότε (εκτελούμε το μπλοκ ενεργειών) διαφορετικά εμφανίζουμε το κείμενο "Η σύνδεση ή ο κωδικός πρόσβασης είναι λάθος!"

Εάν το ζεύγος σύνδεσης-κωδικού αντιστοιχεί, τότε καταχωρούμε τη μεταβλητή συνεδρίας $_SESSION["admin"] και ανακατευθύνουμε τον χρήστη στη σελίδα διαχειριστή - admin.php.
Ας προσπαθήσουμε τώρα να δοκιμάσουμε αυτό που έχουμε ήδη δημιουργήσει. Εάν εισαγάγουμε εσκεμμένα ψευδή στοιχεία σύνδεσης και κωδικό πρόσβασης, θα λάβουμε ένα προειδοποιητικό μήνυμα ότι "Η σύνδεση ή ο κωδικός πρόσβασης είναι λανθασμένος!" Ας προσπαθήσουμε τώρα να εισάγουμε τις σωστές πληροφορίες σύνδεσης. Αν δεν έχουμε κάνει κάποιο λάθος πουθενά, τότε αφού κάνουμε κλικ στο κουμπί «Είσοδος» θα βρεθούμε στη σελίδα διαχειριστή.

Βήμα 6

Τώρα το μόνο που μένει να κάνετε είναι να προσθέσετε μερικές μικρές λεπτομέρειες. Για παράδειγμα, είμαστε πλέον εξουσιοδοτημένοι στο σύστημα, αλλά αν πληκτρολογήσουμε τη διεύθυνση της σελίδας εξουσιοδότησης στη γραμμή διευθύνσεων, θα φτάσουμε εύκολα σε αυτήν και θα δούμε τη φόρμα εξουσιοδότησης. Αυτό δεν πρέπει να συμβεί - μόνο ένας μη εξουσιοδοτημένος χρήστης θα πρέπει να δει τη φόρμα. Πώς μπορούμε να το διορθώσουμε αυτό; Θυμηθείτε ότι στη σελίδα admin.php ελέγξαμε αν η ετικέτα ήταν στη συνεδρία. Εάν δεν υπάρχει, ανακατευθύναμε τον χρήστη στη σελίδα εξουσιοδότησης. Εδώ μπορούμε να κάνουμε το ίδιο πράγμα, μόνο αντίστροφα. Δηλαδή, ελέγχουμε επίσης αν η ετικέτα είναι στη συνεδρία. Μόνο τώρα θα μεταφέρουμε τον χρήστη στη σελίδα διαχειριστή εάν υπάρχει τέτοια ετικέτα. Αυτό είναι, καταρχήν, λογικό. Εάν υπάρχει ετικέτα, τότε ο χρήστης είναι ήδη εξουσιοδοτημένος και μπορούμε να τον μεταφέρουμε στη σελίδα διαχειριστή. Στη σελίδα enter.php μετά την έναρξη της συνεδρίας, προσθέστε τον ακόλουθο κώδικα:

if($_SESSION["admin"])( header("Location: admin.php"); exit; )

εάν ($_SESSION["διαχειριστής"]) (

header("Τοποθεσία: admin.php");

έξοδος ;

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

Βήμα 7

Το επόμενο σημείο που πρέπει να παρέχουμε είναι η υλοποίηση της αποσύνδεσης ενός εξουσιοδοτημένου χρήστη, δηλαδή, ας υποθέσουμε ότι ο διαχειριστής έχει ολοκληρώσει την εργασία του και πρέπει να αποσυνδεθεί ώστε να μην μπορεί να εργαστεί κανένας άλλος στον λογαριασμό του. Για να το κάνετε αυτό, προσθέστε έναν σύνδεσμο "Έξοδος" στη σελίδα admin.php. Ο σύνδεσμος θα οδηγεί στην ίδια σελίδα, θα προστεθεί μόνο η παράμετρος που χρειαζόμαστε. Η παράμετρος προστίθεται χρησιμοποιώντας ένα ερωτηματικό:

Εξοδος

< a href = "admin.php?do=logout" >Εξοδος< / a >

Αυτός ο σύνδεσμος μπορεί να τοποθετηθεί στο μέρος όπου τον χρειαζόμαστε - θα τον βάλω μετά το κείμενο της σελίδας. Όσον αφορά την παράμετρο, θα μεταδοθεί με τη μέθοδο GET (θυμηθείτε ότι μεταδώσαμε δεδομένα από τη φόρμα χρησιμοποιώντας τη δεύτερη παράμετρο - POST). Όταν χρησιμοποιείτε αυτήν τη μέθοδο, τα δεδομένα προσαρτώνται στη διεύθυνση στη γραμμή διευθύνσεων και διαχωρίζονται από τη διεύθυνση μόνο με ένα ερωτηματικό. Περνάμε μια παράμετρο - do - και ταυτόχρονα της εκχωρούμε την τιμή "logout". Πώς μπορούμε να εξουσιοδοτήσουμε τον χρήστη τώρα; Είναι πολύ απλό - το δεύτερο και το τρίτο στάδιο θα μας βοηθήσουν εδώ όταν εργαζόμαστε με συνεδρίες. Όταν φορτωθεί η σελίδα, μπορούμε να ελέγξουμε την τιμή του στοιχείου do από τον πίνακα $_GET. Εάν είναι ίσο με τη συμβολοσειρά "logout", απλώς θα καταργήσουμε την εγγραφή της μεταβλητής περιόδου λειτουργίας $_SESSION["admin"] και θα καταστρέψουμε τη συνεδρία. Αντίστοιχα, δεν θα υπάρχει ετικέτα στη συνεδρία μετά από αυτό, και στο επόμενο μπλοκ, όπου ελέγχουμε την παρουσία της ετικέτας, ο χρήστης θα ανακατευθυνθεί στη σελίδα εξουσιοδότησης. Είναι απλό.

Γειά σου! Τώρα θα προσπαθήσουμε να εφαρμόσουμε την απλούστερη εγγραφή στον ιστότοπο χρησιμοποιώντας PHP + MySQL. Για να γίνει αυτό, το Apache πρέπει να είναι εγκατεστημένο στον υπολογιστή σας. Η αρχή λειτουργίας του σεναρίου μας φαίνεται παρακάτω.

1. Ας ξεκινήσουμε δημιουργώντας τον πίνακα χρηστών στη βάση δεδομένων. Θα περιέχει δεδομένα χρήστη (σύνδεση και κωδικό πρόσβασης). Ας πάμε στο phpmyadmin (αν δημιουργείτε μια βάση δεδομένων στον υπολογιστή σας http://localhost/phpmyadmin/). Δημιουργήστε έναν πίνακα χρήστες, θα έχει 3 πεδία.

Το δημιουργώ στη βάση δεδομένων mysql, μπορείτε να το δημιουργήσετε σε άλλη βάση δεδομένων. Στη συνέχεια, ορίστε τις τιμές όπως στο σχήμα:

2. Απαιτείται σύνδεση σε αυτόν τον πίνακα.Ας δημιουργήσουμε ένα αρχείο bd.php. Το ΠΕΡΙΕΧΟΜΕΝΟ ΤΟΥ:

$db = mysql_connect("ο διακομιστής σας MySQL", "login for this server","password for this server");
mysql_select_db ("όνομα της βάσης δεδομένων στην οποία συνδέουμε", $db);
?>

Στην περίπτωσή μου μοιάζει με αυτό:

$db = mysql_connect("localhost","user","1234");
mysql_select_db("mysql",$db);
?>

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

3. Δημιουργήστε ένα αρχείο reg.php με τα περιεχόμενα (όλα τα σχόλια μέσα):



Εγγραφή


Εγγραφή


















4. Δημιουργήστε ένα αρχείο, το οποίο θα εισάγει δεδομένα στη βάση δεδομένων και θα αποθηκεύσει τον χρήστη. save_user.php(σχόλια μέσα):



{
}
//εάν εισαγάγετε τη σύνδεση και τον κωδικό πρόσβασης, τότε τα επεξεργαζόμαστε έτσι ώστε οι ετικέτες και τα σενάρια να μην λειτουργούν, ποτέ δεν ξέρετε τι μπορούν να εισαγάγουν οι χρήστες


//αφαίρεση επιπλέον διαστημάτων
$login = trim($login);
$password = trim($password);
// σύνδεση στη βάση δεδομένων
// ελέγξτε για την ύπαρξη χρήστη με την ίδια σύνδεση
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
if (!empty($myrow["id"])) (
exit("Λυπούμαστε, η σύνδεση που εισαγάγατε είναι ήδη εγγεγραμμένη. Εισαγάγετε άλλη σύνδεση.");
}
// εάν αυτό δεν συμβαίνει, τότε αποθηκεύστε τα δεδομένα
$result2 = mysql_query("INSERT INTO users (login,password) VALUES("$login","$password")");
// Ελέγξτε εάν υπάρχουν σφάλματα
εάν ($result2=="TRUE")
{
echo "Έχετε εγγραφεί με επιτυχία! Τώρα μπορείτε να εισέλθετε στον ιστότοπο. Αρχική σελίδα";
}
αλλού(
echo "Σφάλμα! Δεν είστε εγγεγραμμένος.";
}
?>

5. Τώρα οι χρήστες μας μπορούν να εγγραφούν!Στη συνέχεια, πρέπει να δημιουργήσετε μια «πόρτα» για να μπουν ήδη εγγεγραμμένοι χρήστες στον ιστότοπο. index.php(σχόλια μέσα) :

// όλη η διαδικασία λειτουργεί σε συνεδρίες. Είναι όπου αποθηκεύονται τα δεδομένα του χρήστη ενώ βρίσκεται στον ιστότοπο. Είναι πολύ σημαντικό να τα λανσάρετε στην αρχή κιόλας της σελίδας!!!
session_start();
?>


Αρχική σελίδα


Αρχική σελίδα











Κανω ΕΓΓΡΑΦΗ



// Ελέγξτε εάν οι μεταβλητές σύνδεσης και αναγνωριστικού χρήστη είναι κενές
εάν (κενό($_SESSION["login"]) ή κενό($_SESSION["id"]))
{
// Εάν είναι κενό, τότε δεν εμφανίζουμε τον σύνδεσμο
echo "Έχετε συνδεθεί ως επισκέπτης
Αυτός ο σύνδεσμος είναι διαθέσιμος μόνο σε εγγεγραμμένους χρήστες".
}
αλλού
{

Στο αρχείο index.phpΘα εμφανίσουμε έναν σύνδεσμο που θα είναι ανοιχτός μόνο σε εγγεγραμμένους χρήστες. Αυτό είναι όλο το νόημα του σεναρίου - ο περιορισμός της πρόσβασης σε οποιαδήποτε δεδομένα.

6. Παραμένει ένα αρχείο με επαλήθευση των εισαγόμενων στοιχείων σύνδεσης και κωδικού πρόσβασης. testreg.php (σχόλια μέσα):

session_start();// όλη η διαδικασία λειτουργεί σε συνεδρίες. Είναι όπου αποθηκεύονται τα δεδομένα του χρήστη ενώ βρίσκεται στον ιστότοπο. Είναι πολύ σημαντικό να τα λανσάρετε στην αρχή κιόλας της σελίδας!!!
if (isset($_POST["login"])) ($login = $_POST["login"]; if ($login == "") ( unset($login);) ) //εισαγάγετε τη σύνδεση που έχει εισαχθεί από ο χρήστης στη μεταβλητή $login, εάν είναι κενή, τότε καταστρέψτε τη μεταβλητή
if (isset($_POST["password"])) ($password=$_POST["password"]; if ($password =="") ( unset($password);) )
//βάλτε τον κωδικό πρόσβασης που εισήγαγε ο χρήστης στη μεταβλητή $password, εάν είναι κενή, τότε καταστρέψτε τη μεταβλητή
εάν (κενό($login) ή κενό($password)) //εάν ο χρήστης δεν εισήγαγε κωδικό σύνδεσης ή κωδικό πρόσβασης, τότε παρουσιάζουμε ένα σφάλμα και διακόπτουμε το σενάριο
{
exit ("Δεν έχετε εισαγάγει όλες τις πληροφορίες, επιστρέψτε και συμπληρώστε όλα τα πεδία!");
}
//εάν εισαγάγετε τη σύνδεση και τον κωδικό πρόσβασης, τότε τα επεξεργαζόμαστε έτσι ώστε οι ετικέτες και τα σενάρια να μην λειτουργούν, ποτέ δεν ξέρετε τι μπορούν να εισαγάγουν οι χρήστες
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//αφαίρεση επιπλέον διαστημάτων
$login = trim($login);
$password = trim($password);
// σύνδεση στη βάση δεδομένων
include("bd.php");// το αρχείο bd.php πρέπει να βρίσκεται στον ίδιο φάκελο με όλα τα άλλα, αν δεν είναι, απλώς αλλάξτε τη διαδρομή

$result = mysql_query("SELECT * FROM users WHERE login="$login"",$db); //ανάκτηση από τη βάση δεδομένων όλων των δεδομένων σχετικά με τον χρήστη με την εισαγόμενη σύνδεση
$myrow = mysql_fetch_array($result);
if (κενό($myrow["password"]))
{
//αν δεν υπάρχει ο χρήστης με τα καταχωρημένα στοιχεία σύνδεσης
}
αλλού(
//αν υπάρχει, τότε ελέγξτε τους κωδικούς πρόσβασης
αν ($myrow["password"]==$password) (
//αν οι κωδικοί πρόσβασης ταιριάζουν, τότε ξεκινάμε μια συνεδρία για τον χρήστη! Μπορείτε να τον συγχαρείτε, μπήκε!
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//αυτά τα δεδομένα χρησιμοποιούνται πολύ συχνά, επομένως ο συνδεδεμένος χρήστης θα "τα φέρει μαζί του"
echo "Έχετε μπει με επιτυχία στον ιστότοπο! Αρχική σελίδα";
}
αλλού(
//αν οι κωδικοί πρόσβασης δεν ταιριάζουν

Έξοδος ("Λυπούμαστε, η σύνδεση ή ο κωδικός πρόσβασης που εισαγάγατε είναι λάθος.");
}
}
?>

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

Τα τσέκαρα όλα, δουλεύει σωστά!