Celibate auth php. HTTP Εγκατάσταση προστασίας σε σελίδα με χρήση MySQL και PHP. Κείμενο πηγής του αρχείου .htaccess

Για να στείλετε ένα μήνυμα "Απαιτείται έλεγχος ταυτότητας" στο πρόγραμμα περιήγησης πελάτη, το οποίο με τη σειρά του θα προκαλέσει την εμφάνιση ενός πλαισίου διαλόγου για την εισαγωγή του ονόματος χρήστη και του κωδικού πρόσβασης. Αφού ο πελάτης εισαγάγει το όνομα και τον κωδικό πρόσβασής του, το σενάριο θα κληθεί ξανά, αλλά με τις προκαθορισμένες μεταβλητές PHP_AUTH_USER, PHP_AUTH_PW και AUTH_TYPE, οι οποίες περιέχουν αντίστοιχα το όνομα χρήστη, τον κωδικό πρόσβασης και τον τύπο ελέγχου ταυτότητας. Αυτές οι μεταβλητές βρίσκονται στον πίνακα $_SERVER και $HTTP_SERVER_VARS. Προς το παρόν υποστηρίζεται μόνο ο "Βασικός" έλεγχος ταυτότητας. Μπορείτε επίσης να διαβάσετε μια πιο λεπτομερή περιγραφή της λειτουργίας επί κεφαλής() .

Ένα παράδειγμα τμήματος σεναρίου που αναγκάζει τον πελάτη να συνδεθεί για να δει τη σελίδα:

Παράδειγμα ελέγχου ταυτότητας HTTP

if (!isset($_SERVER [ "PHP_AUTH_USER" ])) (
επί κεφαλής( "WWW-Authenticate: Basic realm="My Realm"");

ηχώ "Το κείμενο εστάλη όταν
εάν ο χρήστης έκανε κλικ στο κουμπί Άκυρο"
;
έξοδος;
) άλλο (
ηχώ
"

Γεια σας ($_SERVER["PHP_AUTH_USER"]).

" ;
ηχώ "

Έχετε εισαγάγει τον κωδικό πρόσβασής σας ($_SERVER["PHP_AUTH_PW"]).

"
;
}
?>

Σημείωση συμβατότητας:Να είστε ιδιαίτερα προσεκτικοί όταν προσδιορίζετε κεφαλίδες HTTP. Για να εξασφαλιστεί η μέγιστη συμβατότητα με τον μεγαλύτερο αριθμό διαφορετικών πελατών, η λέξη "Βασικό" πρέπει να γράφεται με κεφαλαίο "Β", η περιοχή (βασίλειο) πρέπει να περικλείεται σε διπλά εισαγωγικά (όχι μονό!) και ακριβώς ένα κενό πρέπει να προηγείται ο κώδικας 401 στον τίτλο HTTP/1.0 401 .

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

Μπορείτε να παρατηρήσετε τις λειτουργίες του προγράμματος περιήγησης Internet Explorer. Είναι πολύ επιλεκτικό σχετικά με τις παραμέτρους των μεταδιδόμενων κεφαλίδων. Καθορισμός τίτλου WWW-Authenticateπριν στείλετε την κατάσταση HTTP/1.0 401 είναι ένα μικρό κόλπο.

Ξεκινώντας με την PHP 4.3.0, για να αποτρέψετε κάποιον από το να γράψει ένα σενάριο που αποκαλύπτει τον κωδικό πρόσβασης για μια σελίδα που χρησιμοποιεί εξωτερικό έλεγχο ταυτότητας, οι μεταβλητές PHP_AUTH δεν ορίζονται εάν η σελίδα χρησιμοποιεί εξωτερικό έλεγχο ταυτότητας και έχει οριστεί σε ασφαλή λειτουργία. Ωστόσο, η μεταβλητή REMOTE_USER μπορεί να χρησιμοποιηθεί για τον έλεγχο ταυτότητας ενός εξωτερικά πιστοποιημένου χρήστη. Έτσι, μπορείτε πάντα να χρησιμοποιείτε τη μεταβλητή $_SERVER["REMOTE_USER"].

Σημείωση:Η PHP χρησιμοποιεί την οδηγία AuthType για να υποδείξει εάν χρησιμοποιείται εξωτερικός έλεγχος ταυτότητας ή όχι.

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

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

Παράδειγμα ελέγχου ταυτότητας HTTP με αναγκαστική εισαγωγή νέου ζεύγους σύνδεσης/κωδικού πρόσβασης

λειτουργία authenticate() (
επί κεφαλής( "WWW-Authenticate: Basic realm="Test Authentication System"");
header("HTTP/1.0 401 Μη εξουσιοδοτημένο");
ηχώ "Πρέπει να εισαγάγετε το σωστό όνομα χρήστη και κωδικό πρόσβασης για να αποκτήσετε πρόσβαση στον πόρο \n";
έξοδος;
}

Εάν (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
πιστοποιώ την αυθεντικότητα ();
}
αλλού(
ηχώ
"

Καλώς ορίσατε: ($_SERVER["PHP_AUTH_USER"])
" ;
ηχώ "Προηγούμενη σύνδεση: ($_REQUEST["OldAuth"])";
ηχώ "

\n";
ηχώ "\n";
ηχώ "\n";
ηχώ "\n";
ηχώ "

\n" ;
}
?>

Αυτή η συμπεριφορά δεν διέπεται από τα βασικά πρότυπα ελέγχου ταυτότητας HTTP, επομένως δεν πρέπει να βασίζεστε σε αυτήν. Οι δοκιμές έδειξαν ότι το πρόγραμμα περιήγησης Lynx δεν εκκαθαρίζει την προσωρινή μνήμη εξουσιοδότησης όταν λαμβάνει μια κατάσταση 401 από τον διακομιστή και κάνοντας κλικ στο "Πίσω" και στη συνέχεια στο "Εμπρός" με τη σειρά, είναι δυνατό να ανοίξει μια τέτοια σελίδα, υπό την προϋπόθεση ότι η απαιτούμενη εξουσιοδότηση τα χαρακτηριστικά δεν έχουν αλλάξει. Ωστόσο, ο χρήστης μπορεί να πατήσει το πλήκτρο "_" για να διαγράψει την κρυφή μνήμη ελέγχου ταυτότητας.

Θα πρέπει επίσης να σημειωθεί ότι πριν από την PHP 4.3.3, ο έλεγχος ταυτότητας HTTP δεν λειτουργούσε σε διακομιστές που εκτελούσαν Microsoft IIS, εάν η PHP είχε εγκατασταθεί ως λειτουργική μονάδα CGI, λόγω ορισμένων περιορισμών των υπηρεσιών IIS. Για να λειτουργήσει σωστά στην PHP 4.3.3+, πρέπει να επεξεργαστείτε τη ρύθμιση παραμέτρων των υπηρεσιών IIS που ονομάζεται "Directory Security". Κάντε κλικ στο "Επεξεργασία" και επιλέξτε την επιλογή "Ανώνυμη πρόσβαση", όλα τα άλλα πεδία θα πρέπει να παραμείνουν μη επιλεγμένα.

Ένας άλλος περιορισμός εάν χρησιμοποιείτε τις υπηρεσίες IIS μέσω ISAPI: οι μεταβλητές PHP_AUTH_* δεν έχουν οριστεί, αλλά ταυτόχρονα είναι διαθέσιμη η μεταβλητή HTTP_AUTHORIZATION. Παράδειγμα κώδικα που θα μπορούσατε να χρησιμοποιήσετε: list($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

Σημείωση σχετικά με τις υπηρεσίες IIS::Για να λειτουργεί σωστά ο έλεγχος ταυτότητας HTTP στις υπηρεσίες IIS, η επιλογή cgi.rfc2616_headers στη διαμόρφωση PHP πρέπει να οριστεί στο 0 (η προεπιλεγμένη τιμή).

Προσοχή:Σε περίπτωση που χρησιμοποιείται προστατευμένη λειτουργία, το UID του τρέχοντος σεναρίου θα προστεθεί στο βασικό τμήμα της κεφαλίδας WWW-Authenticate.



<<< Назад Περιεχόμενο Εμπρός >>>
Εάν έχετε οποιεσδήποτε άλλες ερωτήσεις ή κάτι δεν είναι ξεκάθαρο - καλώς ήρθατε στην παρέα μας

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

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

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

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

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

Και μοιάζει με αυτό:

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

Ανάμεσα στις οδηγίες Κεφαλίδα ("HTTP/1.0 401 Μη εξουσιοδοτημένο"); και exit() ; εισάγουμε οτιδήποτε - από μια απλή φράση ότι δεν μπορείτε να έρθετε εδώ μέχρι μια πρόταση να πάτε κάπου, να πετάξετε, να τρέξετε, να σέρνετε και ούτω καθεξής. Ναι, σχεδόν ξέχασα - οι μεταβλητές $dbhost, $dbuser, $dbpasswd και $dbname αποθηκεύουν δεδομένα που παρέχουν πρόσβαση στη βάση δεδομένων και το όνομα της βάσης δεδομένων.

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

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

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

Μπορείτε να κλείσετε μια τέτοια σελίδα με πολλούς συμπληρωματικούς τρόπους:

  1. Προστασία κωδικού πρόσβασης (login/password) με χρήση μεταβλητών $_SERVER["PHP_AUTH_USER"]Και $_SERVER["PHP_AUTH_PW"].
  2. Προστασία από IPδιεύθυνση πελάτη χρησιμοποιώντας μια μεταβλητή $_SERVER["REMOTE_ADDR"].
  3. Προστασία από ΜΑΚδιεύθυνση σε τοπικά δίκτυα (επιπλέον της προστασίας από IP).

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

" ,"

Σφάλμα ελέγχου ταυτότητας

" ,"

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

" ,""; έξοδος; ); ?>

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

" ,"

Καλως ΗΡΘΑΤΕ!

" ,"

Έχετε συνδεθεί χρησιμοποιώντας τα στοιχεία σύνδεσης ",$auth_user," και τον κωδικό πρόσβασης ",$auth_pass,".

" ,"

"; ?>

Ο κωδικός επαλήθευσης σύνδεσης και κωδικού πρόσβασης δεν είναι πολύ περίπλοκος σε αυτήν την περίπτωση, καθώς εφαρμόζεται για ένα άτομο. Η λογική λειτουργίας είναι απλή εάν δεν υπάρχει μεταβλητή $_SERVER["PHP_AUTH_USER"]Και $_SERVER["PHP_AUTH_PW"]ή οι τιμές τους δεν ταιριάζουν με τις απαιτούμενες, τότε καλέστε τη συνάρτηση auth_send(). Μην ξεχνάτε ότι στο τέλος καλεί έξοδος, οπότε η εκτέλεση του προγράμματος σταματά.

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

Η IP σας δεν βρέθηκε!!!"; έξοδος; ); ?>

Εδώ στη γραμμή $allowed_ipsυποδεικνύονται χωρισμένα με κενά IPδιευθύνσεις στις οποίες επιτρέπεται η πρόσβαση. Στη συνέχεια παίρνουμε τον πίνακα χρησιμοποιώντας εκραγεί()και αναζητήστε τη διεύθυνση του πελάτη από $_SERVER["REMOTE_ADDR"]. Χρησιμοποίησα τη συνάρτηση για αναζήτηση array_search(), καθώς είναι απίθανο ο κώδικάς του που εφαρμόζεται στο C να λειτουργεί κάπως πιο γρήγορα από αυτό που μπορούμε να γράψουμε στο PHPχρησιμοποιώντας βρόχους Γιαή για κάθε. Αλλά η ταχύτητα δεν είναι το κύριο πράγμα εδώ :)

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

Όπως έχουν ήδη καταλάβει οι χρήστες Linux, βασίζεται σε ARPπίνακα συστήματος, στον οποίο μπορείτε να προσπελάσετε χρησιμοποιώντας ένα αρχείο /proc/net/arp. Η συνάρτηση αναζητά συμβολοσειρές για τις απαιτούμενες IPδιεύθυνση και την επιστρέφει ΜΑΚδιεύθυνση:

Η IP σας=192.168.10.15 και MAC=00:04:31:E4:F8:37

Στο σύστημα WindowsΊσως υπάρχουν και κάποιοι τρόποι να το αποκτήσετε ΜΑΚαπλούστερο, αλλά από αυτά που πραγματικά λειτουργούν, αυτό είναι το συμπέρασμα ARPπίνακες συστήματος με την εντολή:

C:\WINDOWS\>arp -a Διεπαφή: 192.168.10.15 στη διεπαφή 0x1000003 Διεύθυνση IP Τύπος φυσικής διεύθυνσης 192.168.10.1 00-50-22-b0-6a-a-a-aa δυναμική 191.800003. e8 δυναμική 192.168.10.3 00-04-61-9e-26-09 δυναμική 192.168.10.5 00-0f-38-6a-b1-18 δυναμική

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



Είναι δυνατή η χρήση της λειτουργίας επί κεφαλής()για να στείλετε ένα μήνυμα "Απαιτείται πιστοποίηση"πρόγραμμα περιήγησης, αναγκάζοντάς το να εμφανίσει ένα παράθυρο για την εισαγωγή των στοιχείων σύνδεσης και του κωδικού πρόσβασής σας. Μόλις ο χρήστης συμπληρώσει τη σύνδεση και τον κωδικό πρόσβασης, ο σύνδεσμος που περιέχει το σενάριο PHP θα κληθεί ξανά με τις προκαθορισμένες μεταβλητές PHP_AUTH_USER , PHP_AUTH_PW και AUTH_TYPE που έχουν οριστεί σε login, κωδικό πρόσβασης και τύπο ελέγχου ταυτότητας αντίστοιχα. Αυτές οι προκαθορισμένες μεταβλητές αποθηκεύονται στους πίνακες $_SERVER και $HTTP_SERVER_VARS. Υποστηρίζονται και οι δύο τύποι: "Basic" και "Digest" (από την PHP 5.1.0). Δείτε τη λειτουργία για λεπτομέρειες επί κεφαλής().

Ένα παράδειγμα τμήματος σεναρίου που αναγκάζει τον πελάτη να συνδεθεί για να δει τη σελίδα:

Παράδειγμα #1 Παράδειγμα βασικού ελέγχου ταυτότητας HTTP

if (!isset($_SERVER [ "PHP_AUTH_USER" ])) (
επί κεφαλής( "WWW-Authenticate: Basic realm="My Realm"");

ηχώ "Το κείμενο εστάλη όταν
εάν ο χρήστης έκανε κλικ στο κουμπί Άκυρο"
;
έξοδος;
) άλλο (
ηχώ
"

Γεια σας ( $_SERVER [ "PHP_AUTH_USER" ]) .

" ;
ηχώ "

Έχετε εισαγάγει τον κωδικό πρόσβασής σας( $_SERVER [ "PHP_AUTH_PW" ]) .

" ;
}
?>

Παράδειγμα #2 Περίληψη Παράδειγμα ελέγχου ταυτότητας HTTP

Αυτό είναι ένα παράδειγμα υλοποίησης ενός απλού σεναρίου ελέγχου ταυτότητας HTTP Digest. Για λεπτομέρειες, ανατρέξτε στο » RFC 2617.

$realm = " Απαγορευμένη ζώνη " ;

//χρήστης => κωδικός πρόσβασης
$users = array("admin" => "mypass" , "guest" => "επισκέπτης" );

εάν (κενό($_SERVER [ "PHP_AUTH_DIGEST" ])) (
header("HTTP/1.1 401 Μη εξουσιοδοτημένο");
επί κεφαλής( "WWW-Authenticate: Digest realm="". $βασίλειο.
"",qop="auth",nonce="" . uniqid(). "", αδιαφανές="" . md5 ($realm). """);

Καλούπι( "Το κείμενο αποστέλλεται όταν ο χρήστης κάνει κλικ στο "Ακύρωση");
}

// αναλύστε τη μεταβλητή PHP_AUTH_DIGEST
if (!($data = http_digest_parse ($_SERVER [ "PHP_AUTH_DIGEST" ])) ||
!isset($users [ $data [ "όνομα χρήστη" ]]))
καλούπι( "Λάθος δεδομένα!");

// δημιουργήσει τη σωστή απάντηση
$A1 = md5 ($data [ "όνομα χρήστη" ] . ":" . $realm . ":" . $users [ $data [ "όνομα χρήστη" ]]);
$A2 = md5($_SERVER["REQUEST_METHOD"]. ":" . $data["uri" ]);
$valid_response = md5 ($A1 . ":" . $data [ "nonce" ]. ":" . $data [ "nc" ]. ":" . $data [ "cnonce" ]. ":" . $data [ "qop" ].

if ($data [ "response" ] != $valid_response )
καλούπι( "Λάθος δεδομένα!");

// εντάξει, η σύνδεση και ο κωδικός πρόσβασης είναι σωστά
echo "Είστε συνδεδεμένοι ως: " . $data["όνομα χρήστη"];

// http auth κεφαλίδα ανάλυσης συνάρτηση
συνάρτηση http_digest_parse ($txt)
{
// προστασία από δεδομένα που λείπουν
$needed_parts = array("nonce" => 1 , "nc" => 1 , "cnonce" => 1 , "qop" => 1 , "username" => 1 , "uri" => 1 , "response" => 1 );
$data = array();
$keys = implode ("|" , array_keys ($needed_parts ));

Preg_match_all ("@(" . $keys . ")=(?:([\""])([^\2]+?)\2|([^\s,]+))@", $txt , $matches , PREG_SET_ORDER );

Foreach ($ταιριάζει με $m) (
$data [ $m [ 1 ]] = $m [ 3 ] ? $m [ 3 ] : $m [ 4 ];
unset($needed_parts [ $m [ 1 ]]);
}

Επιστροφή $needed_parts ; false : $data ;
}
?>

Σχόλιο: Σημείωση συμβατότητας

Να είστε ιδιαίτερα προσεκτικοί όταν προσδιορίζετε κεφαλίδες HTTP. Για να εξασφαλιστεί η μέγιστη συμβατότητα με τον μεγαλύτερο αριθμό διαφορετικών πελατών, η λέξη "Βασικό" πρέπει να γράφεται με κεφαλαίο "Β", η περιοχή (βασίλειο) πρέπει να περικλείεται σε διπλά εισαγωγικά (όχι μεμονωμένα!) και ακριβώς ένα κενό πρέπει να προηγείται ο κώδικας 401 στον τίτλο HTTP/1.0 401. Οι παράμετροι ελέγχου ταυτότητας πρέπει να διαχωρίζονται με κόμματα, όπως φαίνεται στο παραπάνω παράδειγμα ελέγχου ταυτότητας Digest.

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

Μπορείτε να παρατηρήσετε τις λειτουργίες του προγράμματος περιήγησης Internet Explorer. Είναι πολύ επιλεκτικό σχετικά με τις παραμέτρους των μεταδιδόμενων κεφαλίδων. Το κόλπο του τίτλου WWW-Authenticateπριν την αποστολή της κατάστασης HTTP/1.0 401δουλεύει για αυτόν μέχρι στιγμής.

Για να αποτρέψετε κάποιον από το να γράψει ένα σενάριο που αποκαλύπτει τον κωδικό πρόσβασης για μια σελίδα που χρησιμοποιεί εξωτερικό έλεγχο ταυτότητας, οι μεταβλητές PHP_AUTH δεν ορίζονται εάν η σελίδα χρησιμοποιεί εξωτερικό έλεγχο ταυτότητας και έχει ρυθμιστεί σε ασφαλή λειτουργία. Ωστόσο, η μεταβλητή REMOTE_USER μπορεί να χρησιμοποιηθεί για τον έλεγχο ταυτότητας ενός εξωτερικά πιστοποιημένου χρήστη. Έτσι, μπορείτε πάντα να χρησιμοποιείτε τη μεταβλητή $_SERVER["REMOTE_USER"].

Σχόλιο: Σημείωση διαμόρφωσης

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

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

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

Παράδειγμα #3 Παράδειγμα ελέγχου ταυτότητας HTTP με αναγκαστική εισαγωγή νέου ζεύγους σύνδεσης/κωδικού πρόσβασης

λειτουργία authenticate() (
επί κεφαλής( "WWW-Authenticate: Basic realm="Test Authentication System"");
header("HTTP/1.0 401 Μη εξουσιοδοτημένο");
ηχώ "Πρέπει να εισαγάγετε το σωστό όνομα χρήστη και κωδικό πρόσβασης για να αποκτήσετε πρόσβαση στον πόρο \n";
έξοδος;
}

if (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
πιστοποιώ την αυθεντικότητα();
) άλλο (
ηχώ "

Καλως ΗΡΘΑΤΕ: ". htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "
" ;
ηχώ "Προηγούμενη σύνδεση: ". htmlspecialchars($_REQUEST["OldAuth"]);
ηχώ "

\n";
ηχώ "\n";
ηχώ ". htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "\" />\n" ;
ηχώ "\n";
ηχώ "

\n" ;
}
?>

Αυτή η συμπεριφορά δεν ρυθμίζεται από πρότυπα Βασικό HTTP- έλεγχος ταυτότητας, επομένως δεν θα πρέπει να εξαρτάστε από αυτό. Δοκιμή προγράμματος περιήγησης Λύγκαςέδειξε ότι Λύγκαςδεν εκκαθαρίζει την προσωρινή μνήμη εξουσιοδότησης όταν λαμβάνει μια κατάσταση 401 από τον διακομιστή και κάνοντας κλικ στο «Πίσω» και μετά στο «Εμπρός» στη σειρά, είναι δυνατό να ανοίξετε μια τέτοια σελίδα, υπό την προϋπόθεση ότι δεν έχουν αλλάξει τα απαιτούμενα χαρακτηριστικά εξουσιοδότησης. Ωστόσο, ο χρήστης μπορεί να πατήσει το πλήκτρο "_" για εκκαθάριση της κρυφής μνήμης ελέγχου ταυτότητας.

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

Σχόλιο: Σημείωση σχετικά με τις υπηρεσίες IIS:
Για να λειτουργήσει σωστά ο έλεγχος ταυτότητας HTTP στις υπηρεσίες IIS, στη διαμόρφωση PHP η επιλογή cgi.rfc2616_headers πρέπει να οριστεί σε 0 (Προεπιλεγμένη τιμή).

Σχόλιο:

Σε περίπτωση που χρησιμοποιείται ασφαλής λειτουργία, θα προστεθεί το UID του τρέχοντος σεναρίου βασίλειο-τμήμα κεφαλίδας WWW-Authenticate.

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

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

Κώδικας MySQL

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ «χρήστες» («ID» int (11) NOT NULL AUTO_INCREMENT, «UID» int (11) NOT NULL, κείμενο «Όνομα χρήστη» ΟΧΙ NULL, κείμενο «email» ΟΧΙ NULL, κείμενο «κωδικός πρόσβασης» NOT NULL, ΚΥΡΙΟ ΚΛΕΙΔΙ (`ID`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Τώρα ας δημιουργήσουμε το αρχείο "sql.php". Είναι υπεύθυνο για τη σύνδεση με τη βάση δεδομένων. Αυτός ο κώδικας δημιουργεί αρχικά μεταβλητές για τον διακομιστή και τον χρήστη όταν συνδέεται με τον διακομιστή. Δεύτερον, θα επιλέξει τη βάση δεδομένων, σε αυτήν την περίπτωση "USERAUTH". Αυτό το αρχείο πρέπει να περιλαμβάνεται στα "log.php" και "reg.php" για πρόσβαση στη βάση δεδομένων.

Κώδικας PHP

//Το όνομα χρήστη MySQL$pass = "redere"; //password $conn = mysql_connect ($server, $user, $pass); //σύνδεση με διακομιστή$db = mysql_select_db("userauth", $conn); //επιλογή βάσης δεδομένωναν (!$db) ( //αν δεν μπορεί να επιλέξει μια βάση δεδομένων echo "Συγγνώμη, σφάλμα:(/>"; //Εμφανίζει ένα μήνυμα σφάλματοςέξοδος(); //Επιτρέπει την εκτέλεση άλλων σεναρίων PHP } ?>

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

Κώδικας PHP

0) { //αν υπάρχουν σφάλματα συνεδρίας$err = "

"; //Ξεκινήστε έναν πίνακα foreach ($_SESSION["ERRMSG"] ως $msg) ( //αναγνώριση κάθε σφάλματος$err .= " "; //γράψτε το σε μια μεταβλητή) $err .= "
" . $msg ."
"; //κλείσιμο του τραπεζιού unset ($_SESSION["ERRMSG"]); //διαγραφή συνεδρίας } ?> Φόρμα σύνδεσης
Όνομα χρήστη
Κωδικός πρόσβασης
Εγγραφή


Στη συνέχεια γράφουμε ένα σενάριο για να συνδεθείτε στο σύστημα. Ας το ονομάσουμε "log.php". Έχει μια λειτουργία καθαρισμού των δεδομένων εισόδου από ενέσεις SQL που μπορεί να καταστρέψουν το σενάριό σας. Δεύτερον, λαμβάνει τα δεδομένα της φόρμας και τα ελέγχει για ορθότητα. Εάν τα δεδομένα εισαγωγής είναι σωστά, το σενάριο στέλνει τον χρήστη στη σελίδα εξουσιοδοτημένων χρηστών, εάν όχι, ορίζει σφάλματα και στέλνει τον χρήστη στη σελίδα σύνδεσης.

Κώδικας PHP

//έναρξη συνεδρίας εγγραφήςσυνάρτηση Fix($str) ( //καθαρισμός πεδίων $str = trim($str); if (get_magic_quotes_gpc()) ( $str = stripslashes ($str); ) //πίνακας για την αποθήκευση σφαλμάτων$errflag = false ; //error flag $username = Fix($_POST["username"]); //Όνομα χρήστη$password = Διόρθωση($_POST["password"]);//password ) //έλεγχος κωδικού πρόσβασης if ($password == "") ( $errmsg = "Λείπει ο κωδικός πρόσβασης"; //error $errflag = true; //υψώνει τη σημαία σε περίπτωση σφάλματος) //αν σηκωθεί η σημαία σφάλματος, ανακατευθύνεται πίσω στη φόρμα εγγραφής //καταγράφει σφάλματα session_write_close(); //κλείσιμο της συνεδρίας //ανακατεύθυνσηέξοδος(); ) //ερώτημα στη βάση δεδομένων$qry = "SELECT * FROM `users` WHERE `Username` = "$username" AND `Password` = "" . md5 ($password) . """; $result = mysql_query($qry); //έλεγχος εάν το αίτημα ήταν επιτυχές (αν υπάρχουν δεδομένα σε αυτό) if (mysql_num_rows ($result) == 1) ( while ($row = mysql_fetch_assoc ($result)) ($_SESSION["UID"] = $row["UID"]; //λήψη του UID από τη βάση δεδομένων και τοποθέτησή του στη συνεδρία$_SESSION["USERNAME"] = $όνομα χρήστη; //ορίζει εάν το όνομα χρήστη ταιριάζει με το όνομα της συνεδρίας session_write_close(); //κλείσιμο της συνεδρίας header("location: Member.php"); //ανακατεύθυνση) ) else ( $_SESSION["ERRMSG"] = "Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης"; //error session_write_close(); //κλείσιμο της συνεδρίας header("location: login.php"); //ανακατεύθυνσηέξοδος(); ) ?>

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

Κώδικας PHP

0) { //αν υπάρχουν σφάλματα συνεδρίας$err = "

"; //αρχή του πίνακα foreach ($_SESSION["ERRMSG"] ως $msg) ( //ορίζει κάθε σφάλμα$err .= " "; //τα γράφει σε μια μεταβλητή) $err .= "
" . $msg ."
"; //τέλος του πίνακα unset ($_SESSION["ERRMSG"]); //καταστρέφει τη συνεδρία } ?> Φόρμα εγγραφής
Όνομα χρήστη
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ
Κωδικός πρόσβασης
Επαναλάβετε τον κωδικό πρόσβασης
έχω έναν λογαριασμο


Τώρα θα δημιουργήσουμε ένα σενάριο εγγραφής στο αρχείο "reg.php". Θα περιλαμβάνει "sql.php" για σύνδεση στη βάση δεδομένων. Χρησιμοποιείται η ίδια λειτουργία όπως στο σενάριο σύνδεσης για την εκκαθάριση του πεδίου εισαγωγής. Οι μεταβλητές ορίζονται για πιθανά σφάλματα. Στη συνέχεια είναι μια συνάρτηση για τη δημιουργία ενός μοναδικού αναγνωριστικού που δεν έχει δοθεί ποτέ πριν. Στη συνέχεια εξάγονται και επαληθεύονται τα δεδομένα από τη φόρμα εγγραφής. Γίνεται έλεγχος για να διασφαλιστεί ότι η διεύθυνση email είναι στη σωστή μορφή και ότι ο κωδικός πρόσβασης έχει εισαχθεί ξανά σωστά. Στη συνέχεια, το σενάριο ελέγχει εάν υπάρχει χρήστης με το ίδιο όνομα στη βάση δεδομένων και, εάν ναι, αναφέρει ένα σφάλμα. Τέλος, ο κώδικας προσθέτει τον χρήστη στη βάση δεδομένων.

Κώδικας PHP

//έναρξη συνεδρίας εγγραφήςσυνάρτηση Fix($str) ( //εκκαθάριση πεδίων $str = @trim($str); if (get_magic_quotes_gpc()) ( $str = stripslashes ($str); ) επιστροφή mysql_real_escape_string($str); ) $errmsg = array(); //πίνακας για την αποθήκευση σφαλμάτων$errflag = false ; //σημαία σφάλματος $UID = "12323543534523453451465685454";//μοναδικό αναγνωριστικό $username = Διόρθωση($_POST["όνομα χρήστη"]); //Όνομα χρήστη$email = $_POST["email"]; //Email $password = Fix($_POST["password"]);//password $rpassword = Fix($_POST["rpassword"]);//επαναλάβετε τον κωδικό πρόσβασης //ελέγξτε το όνομα χρήστη if ($username == "") ( $errmsg = "Λείπει το όνομα χρήστη"; //error $errflag = true ; //υψώνει τη σημαία σε περίπτωση σφάλματος) //ελέγξτε το email if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@+(\.+)*(\.(2,3 ))$", $email)) ( //πρέπει να ταιριάζει με τη μορφή: [email προστατευμένο]$errmsg = "Μη έγκυρο email"; //σφάλμα $errflag = true ; //υψώνει τη σημαία σε περίπτωση σφάλματος } //έλεγχος κωδικού πρόσβασης if ($password == "") ( $errmsg = "Λείπει ο κωδικός πρόσβασης"; //error $errflag = true ; //υψώνει τη σημαία σε περίπτωση σφάλματος } //Έλεγχος επανάληψης κωδικού πρόσβασης if ($rpassword == "") ( $errmsg = "Λείπει ο επαναλαμβανόμενος κωδικός πρόσβασης";//error $errflag = true ; //υψώνει τη σημαία σε περίπτωση σφάλματος } //ελέγξτε την εγκυρότητα του κωδικού πρόσβασης if (strcmp($password, $rpassword) != 0) ( $errmsg = "Οι κωδικοί πρόσβασης δεν ταιριάζουν";//error $errflag = true ; //υψώνει τη σημαία σε περίπτωση σφάλματος } //ελέγξτε εάν το όνομα χρήστη είναι διαθέσιμο if ($username != "") ( $qry = "SELECT * FROM `users` WHERE `Username` = "$username""; //query to MySQL $result = mysql_query ($qry); if ($result) ( αν (mysql_num_rows ($result) > 0) ( //αν το όνομα χρησιμοποιείται ήδη$errmsg = "Όνομα χρήστη χρησιμοποιείται ήδη"; //μήνυμα λάθους$errflag = true; //υψώνει τη σημαία σε περίπτωση σφάλματος) mysql_free_result($result); ) ) //αν τα δεδομένα δεν είναι επικυρωμένα, ανακατευθύνεται πίσω στη φόρμα εγγραφής if ($errflag) ( $_SESSION["ERRMSG"] = $errmsg; //μήνυμα λάθους session_write_close(); //κλείσιμο της συνεδρίας header("location: register.php"); //ανακατεύθυνσηέξοδος(); ) //προσθήκη δεδομένων στη βάση δεδομένων$qry = "INSERT INTO `userauth`.`users`(`UID`, `Username`, `Email`, `Password`) VALUES("$UID","$username","$email","" . md5 ($password) . $result = mysql_query($qry); //ελέγξτε εάν το αίτημα προσθήκης ήταν επιτυχές if ($result) ( echo "Σας ευχαριστούμε για την εγγραφή, " .$username ." Παρακαλούμε συνδεθείτε εδώ"; έξοδος (); ) else ( die ("Σφάλμα, ελέγξτε ξανά αργότερα"); ) ?>

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

Κώδικας PHP

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

Κώδικας PHP

Μία από τις προϋποθέσεις στον παραπάνω κώδικα είναι το θέμα της ερώτησης στο .

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

Κώδικας PHP

Έχετε εξουσιοδότηση πρόσβασης σε αυτή τη σελίδα. Πήγαινε έξω ( )

Ο έλεγχος ταυτότητας χρήστη είναι έτοιμος!