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

Πίνακας περιεχομένων:

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

Βίντεο: 3 τρόποι για να δημιουργήσετε ένα ασφαλές σύστημα διαχείρισης συνεδριών σε PHP και MySQL

Βίντεο: 3 τρόποι για να δημιουργήσετε ένα ασφαλές σύστημα διαχείρισης συνεδριών σε PHP και MySQL
Βίντεο: Web Designer 2024, Απρίλιος
Anonim

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

Βήματα

Μέθοδος 1 από 3: Διαμόρφωση βάσης δεδομένων mySQL

2238751 1
2238751 1

Βήμα 1. Δημιουργήστε μια βάση δεδομένων MySQL

Σε αυτόν τον οδηγό θα δημιουργήσουμε μια βάση δεδομένων που ονομάζεται "safe_sessions".

Δείτε πώς μπορείτε να δημιουργήσετε μια βάση δεδομένων σε phpMyAdmin.

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

Δημιουργία κώδικα βάσης δεδομένων:

ΔΗΜΙΟΥΡΓΙΑ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ `safe_session`

Σημείωση: Ορισμένες υπηρεσίες φιλοξενίας δεν σας επιτρέπουν να δημιουργήσετε μια βάση δεδομένων μέσω phpMyAdmin. Μάθετε πώς να το κάνετε στο cPanel.

2238751 2
2238751 2

Βήμα 2. Δημιουργήστε έναν χρήστη μόνο με δικαιώματα SELECT, INSERT και DELETE

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

  • Χρήστης:

    "sec_user"

  • Κωδικός πρόσβασης:

    "eKcGZr59zAa2BEWU"

Δημιουργία κωδικού χρήστη:

ΔΗΜΙΟΥΡΓΙΑ ΧΡΗΣΤΗ 'sec_user'@'localhost' IDENTIFIED BY 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `ewle_session`.* TO 'sec_user'@'localhost';

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

2238751 3
2238751 3

Βήμα 3. Δημιουργήστε έναν πίνακα MySQL με το όνομα "session"

Ο παρακάτω κώδικας δημιουργεί έναν πίνακα με 4 πεδία (id, set_time, data, session_key).

Δημιουργήστε τον πίνακα "συνεδρίες":

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑΣ `συνεδρίες` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id ')) ΚΙΝΗΤΗΡΑ = InnoDB DEFAULT CHARSET = latin1;

Χρησιμοποιούμε τον τύπο δεδομένων CHAR για πεδία που γνωρίζουμε το μήκος, καθώς τα πεδία "id" και "session_key" θα έχουν πάντα 128 χαρακτήρες. Η χρήση του CHAR εδώ εξοικονομεί ισχύ επεξεργασίας.

Μέθοδος 2 από 3: Δημιουργία αρχείου session.class.php

2238751 4
2238751 4

Βήμα 1. Δημιουργία τάξης

Για να ξεκινήσετε μια νέα τάξη θα πρέπει να εισαγάγετε τον παρακάτω κωδικό:

Νέα τάξη:

συνεδρία τάξης {

2238751 5
2238751 5

Βήμα 2. Δημιουργήστε συνάρτηση _construct

Αυτή η συνάρτηση θα καλείται κάθε φορά που δημιουργούμε μια νέα παρουσία ενός αντικειμένου χρησιμοποιώντας την κλάση "session". Μπορείτε να διαβάσετε τη συνάρτηση PHP _construct εδώ.

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

_Συνάρτηση κατασκευής:

συνάρτηση _construct () {// ορίστε τις προσαρμοσμένες λειτουργίες περιόδου σύνδεσης. session_set_save_handler (πίνακας ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'καταστροφή'), πίνακας ($ this, 'gc')); // Αυτή η γραμμή αποτρέπει απροσδόκητα εφέ όταν χρησιμοποιείτε αντικείμενα ως χειριστές αποθήκευσης. Register_shutdown_function ('session_write_close')? }

2238751 6
2238751 6

Βήμα 3. Δημιουργήστε τη λειτουργία start_session

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

συνάρτηση start_session:

συνάρτηση start_session ($ session_name, $ safe) {// Βεβαιωθείτε ότι το cookie περιόδου σύνδεσης δεν είναι προσβάσιμο μέσω javascript. $ httponly = true; // Αλγόριθμος κατακερματισμού για χρήση για την περίοδο λειτουργίας. (χρησιμοποιήστε το hash_algos () για να λάβετε μια λίστα με τα διαθέσιμα hashes.) $ session_hash = 'sha512'; // Ελέγξτε αν το hash είναι διαθέσιμο εάν (in_array ($ session_hash, hash_algos ())) {// Ορίστε τη λειτουργία has. ini_set ('session.hash_function', $ session_hash); } // Πόσα bits ανά χαρακτήρα του hash. // Οι πιθανές τιμές είναι '4' (0-9, a-f), '5' (0-9, a-v) και '6' (0-9, a-z, A-Z, "-", ","). ini_set ("session.hash_bits_per_character", 5); // Αναγκάστε τη συνεδρία να χρησιμοποιεί μόνο cookie και όχι μεταβλητές URL. ini_set ('session.use_only_cookies', 1); // Λήψη παραμέτρων cookie συνεδρίας $ cookieParams = session_get_cookie_params (); // Ορίστε τις παραμέτρους session_set_cookie_params ($ cookieParams ["διάρκεια ζωής"], $ cookieParams ["διαδρομή"], $ cookieParams ["domain"], $ safe, $ httponly); // Αλλαγή του ονόματος της περιόδου σύνδεσης_όνομα_δείας ($ session_name). // Τώρα ξεκινάμε τη συνεδρία session_start (); // Αυτή η γραμμή αναγεννά τη συνεδρία και διαγράφει την παλιά. // Δημιουργεί επίσης ένα νέο κλειδί κρυπτογράφησης στη βάση δεδομένων. session_regenerate_id (true); }

2238751 7
2238751 7

Βήμα 4. Δημιουργήστε ανοιχτή συνάρτηση

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

ανοιχτή λειτουργία:

λειτουργία ανοιχτή () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'safe_session'; $ mysqli = νέο mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; επιστροφή αληθινός? }

2238751 8
2238751 8

Βήμα 5. Δημιουργήστε τη λειτουργία κλεισίματος

Αυτή η λειτουργία θα κληθεί όταν οι συνεδρίες θέλουν να κλείσουν.

λειτουργία κλεισίματος:

συνάρτηση close () {$ this-> db-> close (); επιστροφή αληθινός? }

2238751 9
2238751 9

Βήμα 6. Δημιουργήστε τη λειτουργία ανάγνωσης

Αυτή η συνάρτηση θα καλείται από την PHP όταν προσπαθούμε να έχουμε πρόσβαση σε μια περίοδο σύνδεσης, για παράδειγμα όταν χρησιμοποιούμε echo $ _SESSION ['κάτι'];. Επειδή μπορεί να υπάρχουν πολλές κλήσεις σε αυτήν τη λειτουργία σε μία σελίδα, εκμεταλλευόμαστε τις προετοιμασμένες δηλώσεις, όχι μόνο για ασφάλεια, αλλά και για απόδοση. Ετοιμάζουμε τη δήλωση μόνο μία φορά και στη συνέχεια μπορούμε να την εκτελέσουμε πολλές φορές.

Επίσης αποκρυπτογραφούμε τα δεδομένα της περιόδου σύνδεσης που είναι κρυπτογραφημένα στη βάση δεδομένων. Χρησιμοποιούμε κρυπτογράφηση 256-bit AES στις συνεδρίες μας.

λειτουργία ανάγνωσης:

συνάρτηση read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> προετοιμασία ("ΕΠΙΛΟΓΗ δεδομένων ΑΠΟ συνεδρίες ΠΟΥ id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> εκτέλεση (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ data); $ this-> read_stmt-> fetch (); $ key = $ this-> getkey ($ id); $ data = $ this-> αποκρυπτογράφηση ($ data, $ key); επιστροφή $ δεδομένων. }

2238751 10
2238751 10

Βήμα 7. Δημιουργήστε συνάρτηση εγγραφής

Αυτή η συνάρτηση χρησιμοποιείται όταν εκχωρούμε μια τιμή σε μια περίοδο σύνδεσης, για παράδειγμα $ _SESSION ['something'] = 'something else';. Η συνάρτηση κρυπτογραφεί όλα τα δεδομένα που εισάγονται στη βάση δεδομένων.

συνάρτηση εγγραφής:

λειτουργία εγγραφής ($ id, $ data) {// Λάβετε μοναδικό κλειδί $ key = $ this-> getkey ($ id); // Κρυπτογράφηση δεδομένων $ data = $ this-> κρυπτογράφηση ($ data, $ key); $ time = χρόνος (); αν (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> προετοιμαστεί ("ΑΝΤΙΚΑΤΑΣΤΑΣΗ ΣΕ περιόδους σύνδεσης (id, set_time, data, key_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> εκτέλεση (); επιστροφή αληθινός? }

2238751 11
2238751 11

Βήμα 8. Δημιουργήστε συνάρτηση καταστροφής

Αυτή η συνάρτηση διαγράφει τη συνεδρία από τη βάση δεδομένων, χρησιμοποιείται από το php όταν καλούμε συναρτήσεις όπως session_destroy ();.

καταστρέψτε τη λειτουργία:

συντριβή λειτουργίας ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> προετοιμασία ("ΔΙΑΓΡΑΦΗ ΑΠΟ συνεδρίες ΠΟΥ id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); επιστροφή αληθινός? }

2238751 12
2238751 12

Βήμα 9. Δημιουργήστε τη λειτουργία gc (συλλέκτη σκουπιδιών)

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

συνάρτηση gc ():

συνάρτηση gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> προετοιμασία ("ΔΙΑΓΡΑΦΗ ΑΠΟ συνεδρίες WHERE set_time <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> εκτέλεση (); επιστροφή αληθινός? }

2238751 13
2238751 13

Βήμα 10. Δημιουργήστε τη συνάρτηση getKey

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

getkey () Λειτουργία:

ιδιωτική λειτουργία getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> προετοιμασία ("ΕΠΙΛΕΞΤΕ κλειδί συνόδου από τις συνεδρίες WHERE id =? LIMIT 1"); } $ this-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> εκτέλεση (); $ this-> key_stmt-> store_result (); if ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key); $ this-> key_stmt-> fetch (); επιστροφή κλειδιού $ } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); επιστροφή $ random_key; }}

2238751 14
2238751 14

Βήμα 11. Δημιουργήστε λειτουργίες κρυπτογράφησης και αποκρυπτογράφησης

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

λειτουργίες κρυπτογράφησης () και αποκρυπτογράφησης ():

κρυπτογράφηση ιδιωτικής λειτουργίας ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (hash ('sha256', $ salt. $ key. $ salt), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ encrypted = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ key, $ data, MCRYPT_MODE_ECB, $ iv)); επιστροφή $ κρυπτογραφημένη. } αποκρυπτογράφηση ιδιωτικής λειτουργίας ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (hash ('sha256', $ salt. $ key. $ salt), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ αποκρυπτογραφημένο = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ αποκρυπτογραφήθηκε = rtrim ($ αποκρυπτογραφήθηκε, "\ 0"); επιστροφή $ αποκρυπτογραφημένο? }

2238751 15
2238751 15

Βήμα 12. Τέλος τάξης

Εδώ τελειώνουμε τις τάξεις με σγουρά αγκύλες:

Τελική τάξη:

}

Μέθοδος 3 από 3: Δημιουργία σελίδων με περιόδους σύνδεσης

2238751 16
2238751 16

Βήμα 1. Χρήση περιόδων σύνδεσης με τον προσαρμοσμένο διαχειριστή συνεδριών

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

Έναρξη συνεδρίας:

απαιτούν («session.class.php») $ session = νέα συνεδρία (); // Ορισμός σε true αν χρησιμοποιείτε https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Μια τιμή.'; ηχώ $ _SESSION ['κάτι'];

Συνιστάται: