Γιατί είναι επικίνδυνο να ενεργοποιήσετε την παράμετρο PHP register_globals; Δημιουργία απλού συστήματος εγγραφής χρήστη σε PHP και MySQL Impersonal index php register

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

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

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

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

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

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

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



Εγγραφή


Εγγραφή


Η σύνδεσή σας:




Ο κωδικός σας:








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

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




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


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


Η σύνδεσή σας:


Ο κωδικός σας:






Κανω ΕΓΓΡΑΦΗ



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

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

Reg.ru: τομείς και φιλοξενία

Ο μεγαλύτερος καταχωρητής και πάροχος φιλοξενίας στη Ρωσία.

Περισσότερα από 2 εκατομμύρια ονόματα τομέα σε υπηρεσία.

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

Περισσότεροι από 700 χιλιάδες πελάτες σε όλο τον κόσμο έχουν ήδη κάνει την επιλογή τους.

*Κάντε το ποντίκι για παύση της κύλισης.

Πίσω μπροστά

Δημιουργία απλού συστήματος εγγραφής χρηστών σε PHP και MySQL

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

Και ακόμα και αφού τα γράψετε όλα αυτά, οι χρήστες θα είναι απρόθυμοι να εγγραφούν, γιατί... αυτό απαιτεί κάποια προσπάθεια εκ μέρους τους.

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



Δείτε πώς θα λειτουργεί το εξαιρετικά απλό σύστημά μας:

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

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

Πλεονεκτήματα αυτής της προσέγγισης:

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

Ελαττώματα:

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

Συγκρίνοντας τα πλεονεκτήματα και τα μειονεκτήματα του συστήματός μας, μπορούμε να πούμε ότι το σύστημα έχει υψηλή χρηστικότητα (μέγιστη ευκολία για τον τελικό χρήστη) και, ταυτόχρονα, έχει χαμηλό δείκτη ασφαλείας.

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

Πώς να χρησιμοποιήσετε αυτό το σύστημα

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

Πρέπει να κατεβάσετε τις πηγές που επισυνάπτονται στο μάθημα
- Βρείτε το αρχείο tables.sql στο αρχείο. Εισαγάγετε το στη βάση δεδομένων σας χρησιμοποιώντας την επιλογή εισαγωγής στο phpMyAdmin. Εναλλακτικός τρόπος: ανοίξτε αυτό το αρχείο μέσω ενός προγράμματος επεξεργασίας κειμένου, αντιγράψτε το ερώτημα SQL και εκτελέστε το.
- Ανοίξτε το include/main.php και συμπληρώστε τις ρυθμίσεις για τη σύνδεση με τη βάση δεδομένων σας (καθορίστε τον χρήστη και τον κωδικό πρόσβασης για τη σύνδεση με τη βάση δεδομένων, καθώς και τον κεντρικό υπολογιστή και το όνομα της βάσης δεδομένων). Στο ίδιο αρχείο, πρέπει επίσης να καθορίσετε το email, το οποίο θα χρησιμοποιηθεί ως η αρχική διεύθυνση για τα μηνύματα που αποστέλλονται από το σύστημα. Ορισμένοι κεντρικοί υπολογιστές αποκλείουν τα εξερχόμενα μηνύματα ηλεκτρονικού ταχυδρομείου, εκτός εάν η φόρμα περιέχει μια πραγματική διεύθυνση email, η οποία δημιουργήθηκε από τον πίνακα ελέγχου του κεντρικού υπολογιστή, οπότε παρέχετε μια πραγματική διεύθυνση.
- Μεταφορτώστε όλα τα αρχεία και τα στοιχεία index.php , protected.php και περιλαμβάνει φακέλους μέσω FTP στον κεντρικό υπολογιστή σας.
- Προσθέστε τον παρακάτω κώδικα σε κάθε σελίδα PHP όπου θέλετε να εμφανιστεί η φόρμα σύνδεσης.

Require_once "περιλαμβάνει/main.php"; $user = νέος χρήστης(); if(!$user->loggedIn())( ανακατεύθυνση("index.php"); )
- Ετοιμος!

Για όσους ενδιαφέρονται για το πώς λειτουργούν όλα, διαβάστε παρακάτω!

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

index.php

Εκμάθηση: Super Simple Registration System With PHP & MySQL Login or Register

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

Είσοδος/Εγγραφή

Στην ενότητα κεφαλιού (μεταξύ των ετικετών και) συμπεριέλαβα τα κύρια στυλ (δεν καλύπτονται σε αυτό το σεμινάριο, επομένως μπορείτε να τα δείτε μόνοι σας. Στοιχεία φακέλου/css/style.css). Πριν από την ετικέτα κλεισίματος, συμπεριέλαβα τη βιβλιοθήκη jQuery και το αρχείο script.js, τα οποία θα γράψουμε και θα αναλύσουμε παρακάτω.


JavaScript

Το jQuery παρακολουθεί την κατάσταση του κουμπιού "Εγγραφή/Είσοδος" χρησιμοποιώντας τη λειτουργία e.preventDefault()και στέλνει αιτήματα AJAX. Ανάλογα με την απόκριση του διακομιστή, εμφανίζει ένα ή άλλο μήνυμα και καθορίζει περαιτέρω ενέργειες/

assets/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (email: email), συνάρτηση (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else(form.removeClass("error").addClass("loggedIn"); messageHolder . text(m.message); ) )); )); $(document).ajaxStart(function())( form.addClass("loading"); )); $(document).ajaxComplete(function()) ( φόρμα. removeClass("φόρτωση"); )); ));

προστέθηκε στη φόρμα για να εμφανιστεί η τρέχουσα κατάσταση του αιτήματος AJAX (αυτό κατέστη δυνατό χάρη στις μεθόδους ajaxStart()) Και ajaxComplete(), το οποίο μπορείτε να βρείτε προς το τέλος του αρχείου).

Αυτή η κλάση εμφανίζει ένα περιστρεφόμενο κινούμενο αρχείο GIF (σαν να μας υπαινίσσεται ότι το αίτημα υποβάλλεται σε επεξεργασία) και επίσης λειτουργεί ως σημαία για να αποτρέψει την εκ νέου υποβολή της φόρμας (όταν το κουμπί εγγραφής έχει ήδη πατηθεί μία φορά). Η κλάση .loggedIn είναι μια άλλη σημαία - ορίζεται όταν στάλθηκε το email. Αυτή η σημαία αποκλείει αμέσως τυχόν περαιτέρω ενέργειες με τη φόρμα.

Σχήμα βάσης δεδομένων

Το απίστευτα απλό σύστημα καταγραφής μας χρησιμοποιεί 2 πίνακες MySQL (ο κώδικας SQL βρίσκεται στο αρχείο tables.sql). Το πρώτο αποθηκεύει δεδομένα σχετικά με λογαριασμούς χρηστών. Το δεύτερο αποθηκεύει πληροφορίες σχετικά με τον αριθμό των προσπαθειών σύνδεσης.


Σχήμα πίνακα χρήστη.

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


Σχήμα πίνακα που μετρά τον αριθμό των προσπαθειών εξουσιοδότησης.

Και στους δύο πίνακες, η διεύθυνση IP αποθηκεύεται σε επεξεργασμένη μορφή, χρησιμοποιώντας τη συνάρτηση ip2long σε ένα πεδίο ακέραιου τύπου.

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

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

User.class.php

Class User( // Private ORM case private $orm; /** * Εύρεση χρήστη ανά διακριτικό. Μόνο έγκυρα διακριτικά γίνονται δεκτά για εξέταση. Το διακριτικό δημιουργείται μόνο για 10 λεπτά από τη στιγμή που δημιουργήθηκε * @param string $token Αυτό είναι αυτό που ψάχνουμε για διακριτικό * @return Χρήστης Επιστρέψτε την τιμή της συνάρτησης χρήστη */ δημόσια στατική συνάρτηση findByToken($token)( // βρείτε το διακριτικό στη βάση δεδομένων και βεβαιωθείτε ότι η σωστή χρονική σήμανση έχει οριστεί $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) επιστροφή νέου χρήστη($result); ) /** * Εξουσιοδότηση ή εγγραφή χρήστη * @param string $email Διεύθυνση email χρήστη * @return Χρήστης */ δημόσια στατική συνάρτηση loginOrRegister($email)( // Εάν αυτός ο χρήστης ήδη υπάρχει, επιστρέψτε την τιμή της συνάρτησης χρήστη από την καθορισμένη διεύθυνση email που είναι αποθηκευμένη στη βάση δεδομένων if(User::exists($email))( return new User($email); ) // Διαφορετικά, δημιουργήστε έναν νέο χρήστη στη βάση δεδομένων και επιστρέψτε την τιμή της συνάρτησης User::create από το καθορισμένο email return User::create($email ); ) /** * Δημιουργήστε έναν νέο χρήστη και αποθηκεύστε στη βάση δεδομένων * @param string $email. Διεύθυνση email χρήστη * @return Χρήστης */ ιδιωτική στατική συνάρτηση create($email)( // Γράψτε έναν νέο χρήστη και επιστρέψτε το αποτέλεσμα της συνάρτησης χρήστη από αυτές τις τιμές $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Ελέγξτε εάν ένας τέτοιος χρήστης υπάρχει στη βάση δεδομένων και επιστρέψτε τη Boolean τιμή του η μεταβλητή * @param string $email. Διεύθυνση email χρήστη * @return boolean */ υπάρχει δημόσια στατική συνάρτηση($email)( // Υπάρχει ο χρήστης στη βάση δεδομένων; $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1;) /** * Δημιουργία νέου αντικειμένου χρήστη * @param instance $param ORM , id, email ή 0 * @return Χρήστης */ δημόσια συνάρτηση __construct($param = null) ( if($param instanceof ORM)( // Ο έλεγχος ORM πέρασε $this->orm = $param; ) else if(is_string($param))( // Ο έλεγχος email πέρασε $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // η τιμή της μεταβλητής $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 */ public function 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 void */ public function login())( // Επισήμανση του χρήστη ως συνδεδεμένου $_SESSION["loginid"] = $this->orm->id; // Ενημέρωση του τιμή του πεδίου βάσης δεδομένων last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Καταστρέψτε τη συνεδρία και αποσυνδέστε τον χρήστη * @return void */ αποσύνδεση δημόσιας συνάρτησης ()( $_SESSION = array(); unset($_SESSION); ) /** * Ελέγξτε εάν ο χρήστης είναι συνδεδεμένος * @return boolean */ δημόσια συνάρτηση logedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Ελέγχει εάν ο χρήστης είναι διαχειριστής * @return boolean */ public συνάρτηση isAdmin())( return $this->rank() = = "administrator"; ) /** * Βρείτε τον τύπο χρήστη, μπορεί να είναι είτε διαχειριστής είτε κανονικός * @return string */ public function rank())(εάν ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Μέθοδος που σας επιτρέπει να λαμβάνετε τις ιδιωτικές πληροφορίες του χρήστη ως * ιδιότητες του αντικειμένου χρήστη * @ συμβολοσειρά παραμέτρων $key Το όνομα της ιδιότητας που αποκτά πρόσβαση * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> $key; ) επιστροφή null? ) )

Τα διακριτικά δημιουργούνται χρησιμοποιώντας τον αλγόριθμο SHA1 και αποθηκεύονται στη βάση δεδομένων. Χρησιμοποιώ τις λειτουργίες χρονισμού της MySQL για να ορίσω ένα χρονικό όριο 10 λεπτών για την εγκυρότητα ενός διακριτικού.

Όταν ένα διακριτικό επικυρώνεται, λέμε απευθείας στον χειριστή ότι εξετάζουμε μόνο διακριτικά που δεν έχουν ακόμη λήξει, αποθηκευμένα στη στήλη token_validity.

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

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


Προστατευμένη σελίδα

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

λειτουργίες.php

Συνάρτηση send_email($from, $to, $subject, $message)( // Βοηθός που στέλνει email $headers = "MIME-Έκδοση: 1.0" . "\r\n"; $headers .= "Τύπος περιεχομένου: κείμενο /plain; charset=utf-8" . "\r\n"; $headers .= "From: ".$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"]; ) else( $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("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00 ")") ->count(); // Αριθμός προσπαθειών σύνδεσης τα τελευταία 10 λεπτά σε αυτήν τη διεύθυνση IP $count_10_min = ORM::for_table("reg_login_attempt") ->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)( throw new Exception("Πάρα πολλές προσπάθειες σύνδεσης!"); ) ) συνάρτηση 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_tickπαρακολουθήστε τον αριθμό των προσπαθειών εξουσιοδότησης για το χρονικό διάστημα που έχει παρέλθει από την πρώτη προσπάθεια. Η προσπάθεια σύνδεσης καταγράφεται στη βάση δεδομένων στη στήλη reg_login_attempt. Αυτές οι συναρτήσεις καλούνται όταν τα δεδομένα της φόρμας υποβάλλονται σε επεξεργασία και υποβάλλονται, όπως μπορείτε να δείτε από το παρακάτω απόσπασμα κώδικα.

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

index.php

Δοκιμάστε( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Εξαγωγή κεφαλίδας JSON("Content-type: application/json"); // Είναι έγκυρη αυτή η διεύθυνση email εάν (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(writ new Exception("Please enter a valid email."); ) // Ελέγξτε. Είναι το χρήστης που επιτρέπεται να συνδεθεί, έχει υπερβεί τον αριθμό των επιτρεπόμενων συνδέσεων; (αρχείο functions.php για περισσότερες πληροφορίες) rate_limit($_SERVER["REMOTE_ADDR"]); // Καταγραφή αυτής της προσπάθειας σύνδεσης rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Στείλτε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στον χρήστη $message = ""; $email = $_POST["email"]; $subject = "Ο σύνδεσμος σύνδεσής σας"; if(!User:: υπάρχει($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); if(!$result)( throw new Exception("Παρουσιάστηκε σφάλμα κατά την αποστολή του email σας. Δοκιμάστε ξανά."); ) die(json_encode(array("message" => "Ευχαριστούμε! Έχουμε στείλει έναν σύνδεσμο στα εισερχόμενά σας. Ελέγξτε και το φάκελο ανεπιθύμητων."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() )));)

Μετά την επιτυχή σύνδεση/εγγραφή, ο παραπάνω κωδικός θα στείλει στον χρήστη έναν σύνδεσμο σύνδεσης. Το διακριτικό γίνεται διαθέσιμο επειδή μεταβιβάζεται ως μεταβλητή στον παραγόμενο σύνδεσμο από τη μέθοδο $_GETμε δείκτη tkn

index.php

If(isset($_GET["tkn"]))( // Είναι αυτό το διακριτικό έγκυρο για εξουσιοδότηση; $user = Χρήστης::findByToken($_GET["tkn"]); if($user)( // Ναι , είναι. Ανακατεύθυνση σε μια προστατευμένη σελίδα $user->login(); redirect("protected.php"); ) // Όχι, το διακριτικό δεν είναι έγκυρο. Ανακατεύθυνση σε μια σελίδα με φόρμα εξουσιοδότησης/εγγραφής redirect("index. php ");)

$user->login()

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

Η επεξεργασία της συνάρτησης για έξοδο από το σύστημα γίνεται με παρόμοιο τρόπο.

index.php

If(isset($_GET["logout"]))($user = new User(); if($user->loggedIn())($user->logout(); ) redirect("index.php") ;)

Στο τέλος του κώδικα, έβαλα ξανά μια ανακατεύθυνση στο index.php, άρα η παράμετρος ?logout=1δεν απαιτείται μετάδοση μέσω URL.

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

index.php

$user = νέος χρήστης(); if($user->loggedIn())( ανακατεύθυνση("protected.php"); )

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

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

// Για να προστατεύσετε κάθε σελίδα στον ιστότοπό σας, συμπεριλάβετε ένα αρχείο main.php // και δημιουργήστε ένα νέο αντικείμενο χρήστη. Τόσο εύκολο είναι! require_once "includes/main.php"; $user = νέος χρήστης(); if(!$user->loggedIn())( ανακατεύθυνση("index.php"); )

Μετά από αυτόν τον έλεγχο, μπορείτε να είστε βέβαιοι ότι ο χρήστης εξουσιοδοτήθηκε με επιτυχία. Μπορείτε επίσης να αποκτήσετε πρόσβαση σε αποθηκευμένες πληροφορίες στη βάση δεδομένων χρησιμοποιώντας ιδιότητες αντικειμένου $user. Για να εμφανίσετε το email και την κατάσταση του χρήστη, χρησιμοποιήστε αυτόν τον κωδικό:

Echo "Το email σας: ".$user->email; echo "Η κατάταξη σας: ".$user->rank();

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

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

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

Τελειώσαμε!

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

Το υλικό ετοιμάστηκε από τον Denis Malyshok ειδικά για την ιστοσελίδα

ΥΣΤΕΡΟΓΡΑΦΟ. Θέλετε να προχωρήσετε περαιτέρω στο mastering PHP και OOP; Δώστε προσοχή στα premium μαθήματα σχετικά με διάφορες πτυχές της κατασκευής ιστοτόπων, συμπεριλαμβανομένου του προγραμματισμού σε PHP, καθώς και σε ένα δωρεάν μάθημα για τη δημιουργία του δικού σας συστήματος CMS στην PHP από την αρχή χρησιμοποιώντας το OOP:

Σας άρεσε το υλικό και θέλετε να με ευχαριστήσετε;
Απλώς μοιραστείτε με τους φίλους και τους συναδέλφους σας!


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

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

Εάν η οδηγία register_globals = On είναι ενεργοποιημένη στον διακομιστή (στο php.ini), τότε κατά τη μεταφορά μεταβλητών μέσω μιας φόρμας ή μέσω μιας γραμμής προγράμματος περιήγησης, στο σενάριο στο οποίο προορίζονται αυτές οι μεταβλητές, θα δημιουργηθούν αυτόματα. Εκείνοι. εάν έχετε τα εξής γραμμένα στη γραμμή του προγράμματος περιήγησής σας: www.server.ru/index.php?var=1, τότε η μεταβλητή $var με τιμή ίση με 1 θα δημιουργηθεί αυτόματα στο σενάριο index.php.

Σχόλιο

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

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

Όταν η οδηγία register_globals είναι απενεργοποιημένη, η πρόσβαση σε τέτοιες μεταβλητές είναι δυνατή με δύο τρόπους:

  • μέσω συσχετιστικών πινάκων HTTP_***_VARS (HTTP_POST_VARS, κ.λπ.)
  • μέσω υπερσφαιρικών πινάκων ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES, κ.λπ.)

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

Αν και μέχρι πρόσφατα, η οδηγία register_globals παρέμενε ενεργοποιημένη σε ιστότοπους φιλοξενίας. Η κατάσταση άρχισε να αλλάζει με την κυκλοφορία της PHP 5, όπου αυτή η οδηγία είναι απενεργοποιημένη από προεπιλογή και οι hosters δεν βιάζονται να την ενεργοποιήσουν (ίσως και σωστά).

Λοιπόν, τι ακριβώς πρέπει να κάνετε για να λάβετε μεταβλητές; Πρέπει να τις πάρετε από υπερσφαιρικούς πίνακες. Για παράδειγμα, για να περάσετε μεταβλητές μέσω της γραμμής του προγράμματος περιήγησης, χρησιμοποιήστε τον πίνακα $_GET. Ας υποθέσουμε ότι η γραμμή του προγράμματος περιήγησης λέει www.server.ru/index.php?var=1. Στη συνέχεια για να λάβετε τη μεταβλητή var στο index.php πρέπει να γράψετε:

$var=$_GET["var"];

Και, για παράδειγμα, για να λάβετε μεταβλητές που μεταφέρονται από μια φόρμα χρησιμοποιώντας τη μέθοδο POST, στο σενάριο χειριστή φόρμας πρέπει να γράψετε:

$var=$_POST["var"];

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

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

Δημιουργία πίνακα στη βάση δεδομένων

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

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

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

Έτσι, σκεφτήκαμε, φανταστήκαμε τι πεδία θα είχε η φόρμα μας και δημιουργήσαμε έναν πίνακα χρήστεςμε αυτά τα πεδία:

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


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

Αυτό είναι, το τραπέζι μας χρήστεςέτοιμος. Ας περάσουμε στο επόμενο στάδιο.

Σύνδεση βάσης δεδομένων

Δημιουργήσαμε τη βάση δεδομένων, τώρα πρέπει να συνδεθούμε σε αυτήν. Θα συνδεθούμε χρησιμοποιώντας την επέκταση PHP MySQLi.

Στον φάκελο του site μας, δημιουργήστε ένα αρχείο με το όνομα dbconnect.phpκαι γράψτε το ακόλουθο σενάριο σε αυτό:

Αυτό το αρχείο dbconnect.phpθα χρειαστεί να συνδεθούν σε χειριστές φορμών.

Παρατηρήστε τη μεταβλητή $address_site, εδώ υπέδειξα το όνομα του δοκιμαστικού μου ιστότοπου στον οποίο θα εργαστώ. Σημειώστε ανάλογα το όνομα του ιστότοπού σας.

Δομή τοποθεσίας

Τώρα ας δούμε τη δομή HTML του ιστότοπού μας.

Θα μετακινήσουμε την κεφαλίδα και το υποσέλιδο του ιστότοπου σε ξεχωριστά αρχεία, header.phpΚαι υποσέλιδο.php. Θα τα συμπεριλάβουμε σε όλες τις σελίδες. Δηλαδή στην κεντρική σελίδα (αρχείο index.php), στη σελίδα με τη φόρμα εγγραφής (αρχείο form_register.php) και στη σελίδα με το έντυπο εξουσιοδότησης (αρχείο form_auth.php).

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

Περιεχόμενα του αρχείου header.php:

Όνομα του ιστότοπού μας

Ως αποτέλεσμα, η κύρια σελίδα μας μοιάζει με αυτό:


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

Τώρα ας προχωρήσουμε στη φόρμα εγγραφής. Όπως καταλαβαίνετε ήδη, το έχουμε στο αρχείο form_register.php.

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

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

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

Και κάτι ακόμα, αν ο χρήστης είναι ήδη εξουσιοδοτημένος και από περιέργεια πηγαίνει απευθείας στη σελίδα εγγραφής γράφοντας στη γραμμή διευθύνσεων του προγράμματος περιήγησης site_address/form_register.php, τότε σε αυτήν την περίπτωση, αντί για τη φόρμα εγγραφής, θα εμφανίσουμε μια κεφαλίδα που θα αναφέρει ότι είναι ήδη εγγεγραμμένος.

Σε γενικές γραμμές, ο κωδικός αρχείου form_register.phpπήραμε αυτό:

Είστε ήδη εγγεγραμμένος

Στο πρόγραμμα περιήγησης, η σελίδα με τη φόρμα εγγραφής μοιάζει με αυτό:


Χρησιμοποιώντας το απαιτούμενο χαρακτηριστικό, κάναμε όλα τα πεδία υποχρεωτικά.

Προσέξτε τον κωδικό της φόρμας εγγραφής όπου εμφανίζεται το captcha:


Καθορίσαμε τη διαδρομή προς το αρχείο στην τιμή του χαρακτηριστικού src για την εικόνα captcha.php, το οποίο δημιουργεί αυτό το captcha.

Ας δούμε τον κώδικα του αρχείου captcha.php:

Ο κώδικας είναι καλά σχολιασμένος, οπότε θα επικεντρωθώ σε ένα μόνο σημείο.

Μέσα σε μια λειτουργία imageTtfText(), καθορίζεται η διαδρομή προς τη γραμματοσειρά verdana.ttf. Για να λειτουργήσει λοιπόν σωστά το captcha, πρέπει να δημιουργήσουμε έναν φάκελο γραμματοσειρέςκαι τοποθετήστε το αρχείο γραμματοσειράς εκεί verdana.ttf. Μπορείτε να το βρείτε και να το κατεβάσετε από το Διαδίκτυο ή να το πάρετε από το αρχείο με τα υλικά αυτού του άρθρου.

Τελειώσαμε με τη δομή HTML, ήρθε η ώρα να προχωρήσουμε.

Έλεγχος εγκυρότητας email χρησιμοποιώντας jQuery

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

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

Για αυτό το πεδίο εισαγωγής, ορίσαμε τον τύπο email (type="email"), αυτό μας προειδοποιεί ελαφρώς για εσφαλμένες μορφές. Αυτό όμως δεν αρκεί, γιατί μέσω του code inspector που μας παρέχει το πρόγραμμα περιήγησης, μπορούμε εύκολα να αλλάξουμε την τιμή του χαρακτηριστικού τύποςΜε ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗεπί κείμενο, και αυτό είναι, η επιταγή μας δεν θα ισχύει πλέον.


Και σε αυτή την περίπτωση, πρέπει να κάνουμε έναν πιο αξιόπιστο έλεγχο. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε τη βιβλιοθήκη jQuery από JavaScript.

Για να συνδέσετε τη βιβλιοθήκη jQuery, στο αρχείο header.phpμεταξύ ετικετών , πριν από την ετικέτα κλεισίματος , προσθέστε αυτή τη γραμμή:

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

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

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

Εγγραφή χρήστη

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

Ανοίξτε αυτό το αρχείο register.phpκαι το πρώτο πράγμα που πρέπει να κάνουμε είναι να γράψουμε μια συνάρτηση έναρξης περιόδου λειτουργίας και να συνδέσουμε το αρχείο που δημιουργήσαμε νωρίτερα dbconnect.php(Σε αυτό το αρχείο κάναμε σύνδεση με τη βάση δεδομένων). Και επίσης, ας δηλώσουμε αμέσως τα κύτταρα error_messagesΚαι επιτυχία_μηνυμάτωνστον πίνακα καθολικών συνεδριών. ΣΕ error_mesagesθα καταγράψουμε όλα τα μηνύματα σφάλματος που προκύπτουν κατά την επεξεργασία της φόρμας και μέσα succes_messages, θα καταγράψουμε χαρμόσυνα μηνύματα.

Πριν συνεχίσουμε, πρέπει να ελέγξουμε αν η φόρμα υποβλήθηκε καθόλου. Ένας εισβολέας μπορεί να κοιτάξει την τιμή του χαρακτηριστικού δράσηαπό τη φόρμα και μάθετε ποιο αρχείο επεξεργάζεται αυτήν τη φόρμα. Και μπορεί να έχει την ιδέα να μεταβεί απευθείας σε αυτό το αρχείο πληκτρολογώντας την ακόλουθη διεύθυνση στη γραμμή διευθύνσεων του προγράμματος περιήγησης: http://site_address/register.php

Πρέπει λοιπόν να ελέγξουμε για ένα κελί στον καθολικό πίνακα POST του οποίου το όνομα ταιριάζει με το όνομα του κουμπιού "Εγγραφή" από τη φόρμα. Με αυτόν τον τρόπο ελέγχουμε αν έγινε κλικ στο κουμπί «Εγγραφή» ή όχι.

Εάν ένας εισβολέας προσπαθήσει να μεταβεί απευθείας σε αυτό το αρχείο, θα λάβει ένα μήνυμα σφάλματος. Να σας υπενθυμίσω ότι η μεταβλητή $address_site περιέχει το όνομα του ιστότοπου και δηλώθηκε στο αρχείο dbconnect.php.

Η τιμή captcha στη συνεδρία προστέθηκε όταν δημιουργήθηκε, στο αρχείο captcha.php. Ως υπενθύμιση, θα σας δείξω ξανά αυτό το κομμάτι κώδικα από το αρχείο captcha.php, όπου η τιμή captcha προστίθεται στη συνεδρία:

Τώρα ας προχωρήσουμε στην ίδια την επαλήθευση. Στο αρχείο register.php, μέσα στο μπλοκ if, όπου ελέγχουμε αν έγινε κλικ στο κουμπί "Εγγραφή" ή μάλλον πού υποδεικνύεται το σχόλιο "" // (1) Κενό για το επόμενο κομμάτι κώδικα"γράφουμε:

//Ελέγξτε το ληφθέν captcha //Περικοπή των διαστημάτων από την αρχή και το τέλος της γραμμής $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Σύγκριση της τιμής που ελήφθη με την τιμή από τη συνεδρία. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Εάν το captcha δεν είναι σωστό, τότε επιστρέφουμε τον χρήστη στη σελίδα εγγραφής και εκεί θα του εμφανίσουμε ένα μήνυμα σφάλματος ότι εισήγαγε λάθος captcha $error_message = "

Λάθος! Εισαγάγατε λάθος captcha

"; // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] = $error_message; // Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Τοποθεσία: " .$address_site ."/form_register.php"); //Διακοπή της δέσμης ενεργειών exit(); ) // (2) Τοποθετήστε το επόμενο κομμάτι κώδικα )else( //Εάν το captcha δεν περάσει ή είναι κενό, βγείτε ("

Λάθος! Δεν υπάρχει κωδικός επαλήθευσης, δηλαδή κωδικός captcha. Μπορείτε να μεταβείτε στην κεντρική σελίδα.

"); }

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

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

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

Επικολλήστε αυτόν τον κωδικό στην καθορισμένη τοποθεσία" // (2) Κενό για το επόμενο κομμάτι κώδικα".

/* Ελέγξτε εάν αποστέλλονται δεδομένα από τη φόρμα στον καθολικό πίνακα $_POST και τυλίξτε τα υποβληθέντα δεδομένα σε κανονικές μεταβλητές.*/ if(isset($_POST["first_name"]))( //Περικοπή των διαστημάτων από την αρχή και τέλος της συμβολοσειράς $first_name = trim($_POST["first_name"]); //Ελέγξτε τη μεταβλητή για κενή if(!empty($first_name))( // Για ασφάλεια, μετατρέψτε ειδικούς χαρακτήρες σε οντότητες HTML $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .= "

Εισάγετε το όνομά σας

Το πεδίο ονόματος λείπει

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) if( isset($_POST["last_name"]))( //Περικοπή διαστημάτων από την αρχή και το τέλος της γραμμής $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Για ασφάλεια, μετατρέψτε τους ειδικούς χαρακτήρες σε οντότητες HTML $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .= "

Παρακαλώ εισάγετε το επώνυμό σας

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) )else ( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .= "

Το πεδίο επωνύμου λείπει

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) if( isset($_POST["email"]))( //Περικοπή διαστημάτων από την αρχή και το τέλος της γραμμής $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Θέση κωδικού για έλεγχο της μορφής της διεύθυνσης email και της μοναδικότητάς της )else( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .="

Συμπληρώστε το email σας

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) )else ( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .= "

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) if( isset($_POST["password"]))( //Περικοπή διαστημάτων από την αρχή και το τέλος της συμβολοσειράς $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Κρυπτογράφηση του κωδικού πρόσβασης $password = md5($password."top_secret"); )else( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .="

Εισάγετε τον κωδικό σας

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) )else ( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .= "

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) // (4) Θέση για τον κώδικα για την προσθήκη ενός χρήστη στη βάση δεδομένων

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

στην καθορισμένη τοποθεσία" // (3) Θέση κωδικού για να ελέγξετε τη μορφή της ταχυδρομικής διεύθυνσης και τη μοναδικότητά της" προσθέστε τον ακόλουθο κώδικα:

//Ελέγξτε τη μορφή της ληφθείσας διεύθυνσης email χρησιμοποιώντας μια τυπική έκφραση $reg_email = "/^**@(+(*+)*\.)++/i"; //Εάν η μορφή της ληφθείσας διεύθυνσης email δεν ταιριάζει με την κανονική έκφραση if(!preg_match($reg_email, $email))( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .= "

Εισαγάγατε λάθος email

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) // Ελέγχουμε αν μια τέτοια διεύθυνση βρίσκεται ήδη στη βάση δεδομένων. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Εάν ο αριθμός των ληφθέντων είναι ακριβώς μία σειρά, πράγμα που σημαίνει ότι ο χρήστης με αυτήν τη διεύθυνση email είναι ήδη εγγεγραμμένος εάν($result_query->num_rows == 1)( //Εάν το αποτέλεσμα που προκύπτει δεν είναι ψευδές if(($row = $result_query->fetch_assoc()) != false) ( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .= "

Ένας χρήστης με αυτήν τη διεύθυνση email έχει ήδη εγγραφεί

". στη συνεδρία . $_SESSION["error_messages"] .= "

Σφάλμα στο ερώτημα της βάσης δεδομένων

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Τοποθεσία: ".$address_site."/form_register.php"); ) /* κλείσιμο της επιλογής */ $ result_query-> close(); //Διακοπή του σεναρίου exit(); ) /* κλείσιμο της επιλογής */ $result_query->close();

Και έτσι, τελειώσαμε με όλους τους ελέγχους, ήρθε η ώρα να προσθέσουμε τον χρήστη στη βάση δεδομένων. στην καθορισμένη τοποθεσία" // (4) Θέση για τον κώδικα για την προσθήκη ενός χρήστη στη βάση δεδομένων" προσθέστε τον ακόλουθο κώδικα:

//Ερώτημα για προσθήκη χρήστη στη βάση δεδομένων $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ("".$first_name."", "".$last_name ." ", "".$email.", "".$password."")"); if(!$result_query_insert)( // Αποθηκεύστε το μήνυμα σφάλματος στη συνεδρία. $_SESSION["error_messages"] .= "

Σφάλμα στο αίτημα για προσθήκη χρήστη στη βάση δεδομένων

"; //Επιστροφή του χρήστη στην κεφαλίδα της σελίδας εγγραφής("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); )else( $_SESSION["success_messages"] = "

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

". result_query_insert-> close(); //Κλείσιμο της σύνδεσης με τη βάση δεδομένων $mysqli->close();

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

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

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

Η συνεδρία ξεκινά επίσης στο αρχείο header.php, λοιπόν στο αρχείο form_auth.phpΔεν χρειάζεται να ξεκινήσουμε μια συνεδρία, γιατί θα εμφανιστεί σφάλμα.


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

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

Εξουσιοδότηση χρήστη

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

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

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

Κωδικός αρχείου logout.php:

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

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

Όλα τα σενάρια έχουν δοκιμαστεί και λειτουργούν. Μπορείτε να κατεβάσετε το αρχείο με τα αρχεία αυτού του μικρού ιστότοπου από αυτόν τον σύνδεσμο.

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

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

Σχέδιο μαθήματος (Μέρος 5):

  • Δημιουργία δομής HTML για τη φόρμα εξουσιοδότησης
  • Επεξεργαζόμαστε τα δεδομένα που λαμβάνονται
  • Εμφανίζουμε τον χαιρετισμό του χρήστη στην κεφαλίδα του ιστότοπου
  • Σας άρεσε το άρθρο;

    Δεν ξέρω γιατί... όχι, ξέρω γιατί δεν μπορείτε να ενεργοποιήσετε την οδηγία register_globals, αλλά δεν ξέρω γιατί στη βιβλιογραφία, κατά κανόνα, τίποτα δεν λέγεται για αυτό.

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

    Πως δουλεύει

    Στις ρυθμίσεις της PHP (αρχείο php.ini) υπάρχει μια τέτοια οδηγία register_globals. Το νόημά του είναι ότι εάν είναι ενεργοποιημένο (register_globals = on), τότε όλες οι μεταβλητές που περνούν μέσω του GET και του POST θα καταχωρούνται αυτόματα ως καθολικές. Τι σημαίνει?

    Για παράδειγμα, περνάμε τη μέθοδο GET στο σενάριο index.php κάποια τιμή σελίδας: index.php?page=2. Η μεταβιβασμένη τιμή αποθηκεύεται σε έναν πίνακα GET και μπορεί να χρησιμοποιηθεί σε ένα σενάριο ως $_GET["σελίδα"]. Ωστόσο, εάν έχουμε ενεργοποιήσει το register_globals, τότε θα δημιουργηθεί μια μεταβλητή $page για την τιμή που πέρασε, η οποία είναι διαθέσιμη σε οποιοδήποτε μέρος του σεναρίου index.php.

    Μια μικρή περίληψη και προσθήκη. Όταν είναι ενεργοποιημένο το register_globals, δημιουργούνται τρία αντίγραφα της μεταβλητής: στον πίνακα GET, στον πίνακα GLOBALS και απλώς η ίδια η μεταβλητή ($_GET["page"], $GLOBALS["page"], $page), ενώ Όταν το register_globals είναι απενεργοποιημένο, η μεταβιβασμένη τιμή μπορεί να είναι προσβάσιμη μόνο μέσω του πίνακα GET ($_GET["σελίδα"]). Θυμάμαι.

    Κίνδυνος χρήσης

    Ας δούμε ένα απλό παράδειγμα για να καταλάβουμε τι μας επιφυλάσσει (από 3 έως 5 χρόνια - σημείωση του συντάκτη). Για να το κάνω πιο εύκολο, θα πω αμέσως ότι το $login και το $password είναι μεταβλητές που μεταβιβάζονται με τη μέθοδο GET/POST.

    Εν συντομία για το τι κάνει το σενάριο:

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

      Γραμμή 3. Λαμβάνουμε αυτόν τον κωδικό πρόσβασης και τον εκχωρούμε στη μεταβλητή $real_pass.

      Γραμμή 4. Συγκρίνουμε τον πραγματικό και τον εισαγόμενο κωδικό πρόσβασης και εάν ταιριάζουν, τότε η μεταβλητή $check θα εκχωρηθεί ως true.

      Γραμμές 5-8. Εάν το $check είναι αληθές, τότε γράφουμε ότι η εξουσιοδότηση ήταν επιτυχής κ.λπ.

    Το προτεινόμενο σενάριο, εξ ορισμού, είναι το πιο διαρροές στον κόσμο, και τώρα θα σας δείξω αυτές τις τρύπες. Προϋπόθεση: το register_globals είναι ενεργοποιημένο.

    Ας υποθέσουμε ότι η μεταφορά πραγματοποιείται με τη μέθοδο GET. Τότε το url θα μοιάζει κάπως έτσι:
    www.site.com/index.php?login =admin&password =qwerty
    Είναι σαφές ότι οι καθολικές μεταβλητές $login και $password δημιουργούνται αμέσως. Δείτε τώρα το σενάριο. Περιέχει τη μεταβλητή $check. Τι γίνεται αν το περάσετε μέσω URL;

    www.site.com/index.php?login =admin&password =qwerty&check =1
    Στη συνέχεια, ο έλεγχος αντιστοίχισης κωδικού πρόσβασης παρακάμπτεται και ο χρήστης εξουσιοδοτείται αμέσως (εξάλλου, θυμάστε ότι το 1 είναι αληθές και το 0 είναι λάθος;). Το ίδιο αποτέλεσμα θα προκύψει αν γράψουμε www.ιστοσελίδα.com/δείκτης.php;έλεγχος =1 . Και ακόμη κι αν χρησιμοποιείτε τη μέθοδο POST, όλες αυτές οι απάτες θα εξακολουθούν να λειτουργούν, καθώς όταν είναι ενεργοποιημένο το register_globals, δεν έχει σημασία ποια μέθοδο χρησιμοποιείτε - GET ή POST.

    Νομίζω ότι κάποιος έχει μια ερώτηση, πώς ξέρει ένας κροτίδα για τη μεταβλητή check, ότι είναι υπεύθυνος για όλα; Εάν δεν έχετε δείξει το σενάριο σε κανέναν, είναι απίθανο να το γνωρίζει. Ωστόσο, δεν χρησιμοποιούν όλοι τα δικά τους σενάρια, CMS κ.λπ., αλλά χρησιμοποιούν ό,τι είναι διαθέσιμο στο δίκτυο. Σε τέτοιες περιπτώσεις, ένα cracker, για παράδειγμα, μπορεί να μελετήσει τον κώδικα CMS και να επιτεθεί σε ιστότοπους που δημιουργήθηκαν με τη βοήθειά του.

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

    Ας πάρουμε το παράδειγμά μας. Για την προστασία του σε περίπτωση που το register_globals είναι ενεργοποιημένο, μετά τη γραμμή εάν ($κωδικός==$πραγματικός_πέρασμα) $επιταγή =αληθής;προσθέστε τα εξής: άλλο $επιταγή =ψευδής;. Σε αυτήν την περίπτωση, ακόμα κι αν η μεταβλητή ελέγχου ίση με ένα περάσει από τη μέθοδο GET, το σενάριο θα εξακολουθεί να ορίζει $check=false εάν ο κωδικός πρόσβασης είναι λανθασμένος.

    Ναι, θα ήθελα επίσης να επιστήσω την προσοχή σας στο γεγονός ότι εάν απενεργοποιήσετε το register_globals, τότε το παράδειγμά μας δεν θα λειτουργήσει. Και για να λειτουργήσει, πρέπει να γράψετε $login = $_POST["login"]; $password = $_POST["password"];

    Ας το συνοψίσουμε...

    και βγάλτε δύο βασικά συμπεράσματα:

    1) Όταν το register_globals είναι ενεργοποιημένο, μπορείτε να μεταβιβάσετε διάφορες μεταβλητές, οι τιμές για τις οποίες δεν υπολογίστηκε ότι θα ληφθούν μέσω GET ή POST.

    2) Το Register_globals από μόνο του δεν είναι τόσο επικίνδυνο όσο ένα στραβά γραμμένο σενάριο.

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

    Με ευχές για μια επιτυχημένη εβδομάδα,
    Alexander SHUYSKY