
Ποιες είναι μερικές οδηγίες για τη διατήρηση υπεύθυνο ασφαλείας συνεδρία με την PHP; Υπάρχουν πληροφορίες σε όλο το web και είναι καιρός όλα προσγειώθηκε σε ένα μέρος!

 
PHP Ασφάλεια Συνεδρία
=====================



Υπάρχουν μερικά πράγματα που πρέπει να κάνετε για να διατηρήσετε τη συνεδρία σας ασφαλή:


1. Χρήση SSL όταν έλεγχο ταυτότητας των χρηστών ή την εκτέλεση ευαίσθητες λειτουργίες.
2. Αναγέννηση του id συνεδρία κάθε φορά που αλλάζει το επίπεδο ασφαλείας (όπως τη σύνδεση). Μπορείτε να αναγεννηθεί ακόμη και το id σύνοδο κάθε αιτήματος, αν το επιθυμείτε.
3. Έχετε συνεδρίες φορά έξω
4. Μην χρησιμοποιείτε εγγραφείτε globals
5. τα στοιχεία ταυτότητας Κατάστημα στο διακομιστή. Δηλαδή, δεν στέλνουν στοιχεία, όπως το όνομα χρήστη στο cookie.
6. Ελέγξτε το `$_SERVER['HTTP_USER_AGENT']`. Αυτό προσθέτει ένα μικρό εμπόδιο για την εισβολή σε περίοδο. Μπορείτε επίσης να ελέγξετε τη διεύθυνση IP. Αλλά αυτό προκαλεί προβλήματα για τους χρήστες που έχουν αλλαγή της διεύθυνσης IP λόγω εξισορρόπηση φορτίου σε πολλές συνδέσεις στο διαδίκτυο κλπ (πράγμα που συμβαίνει στο περιβάλλον μας εδώ).
7. Ασφαλίστε την πρόσβαση στις συνεδρίες σχετικά με το σύστημα αρχείων ή να χρησιμοποιήσετε το χειρισμό προσαρμοσμένο συνεδρία
8. Για τις ευαίσθητες επιχειρήσεις θεωρούν απαιτούν συνδεδεμένους χρήστες να δώσει και πάλι τα στοιχεία authenication τους

 

Μια κατευθυντήρια γραμμή είναι να καλέσετε [session\_regenerate\_id](http://www.php.net/session_regenerate_id) κάθε φορά που αλλάζει το επίπεδο ασφάλειας μιας συνεδρίας. Αυτό βοηθά στην πρόληψη της πειρατείας συνόδου.

 

Νομίζω ότι ένα από τα σημαντικότερα προβλήματα (η οποία απευθύνεται σε PHP 6) είναι register\_globals. Αυτή τη στιγμή μία από τις πρότυπες μεθόδους που χρησιμοποιούνται για να αποφύγετε `register_globals`είναι η χρήση των `$_REQUEST`, `$_GET`ή `$_POST`συστοιχίες.


Ο «σωστός» τρόπος για να το κάνουμε (από 5,2, αν και είναι ένα μικρό αμαξάκι εκεί, αλλά σταθερά από 6, η οποία έρχεται σύντομα) είναι μέσω [των φίλτρων](http://us.php.net/filter) .


Έτσι, αντί να:



```
$username = $_POST["username"];

```

θα κάνετε:



```
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

```

ή ακόμα και απλά:



```
$username = filter_input(INPUT_POST, 'username');

```
 

Αυτό είναι αρκετά ασήμαντο και προφανείς, αλλά να είστε βέβαιος να [session\_destroy](http://www.php.net/session_destroy) μετά από κάθε χρήση. Αυτό μπορεί να είναι δύσκολο να εφαρμοστούν αν ο χρήστης δεν συνδεθεί ρητά, έτσι, ένα χρονόμετρο μπορεί να ρυθμιστεί για να γίνει αυτό.


Εδώ είναι ένα καλό [φροντιστήριο](http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/) για setTimer () και clearTimer ().

 

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


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


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

 

Θα ελέγχει τόσο IP και παράγοντα χρήστη για να δούμε αν αλλάξουν



```
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}

```
 

Χρησιμοποιώντας διεύθυνση IP δεν είναι πραγματικά η καλύτερη ιδέα από την εμπειρία μου. Για παράδειγμα; το γραφείο μου έχει δύο διευθύνσεις IP που συνηθίσουν ανάλογα με το φορτίο και θα τρέχει συνεχώς σε θέματα χρησιμοποιώντας διευθύνσεις IP.


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

 

Εάν χρησιμοποιείτε [session\_set\_save\_handler ()](http://www.php.net/manual/en/function.session-set-save-handler.php) , μπορείτε να ορίσετε το δικό σας πρόγραμμα χειρισμού συνεδρία. Για παράδειγμα, μπορείτε να αποθηκεύσετε συνεδρίες σας στη βάση δεδομένων. Ανατρέξτε στις php.net σχόλια για παραδείγματα ενός χειριστή συνεδρία της βάσης δεδομένων.


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

 

Πρέπει να είστε βέβαιοι ότι τα δεδομένα συνόδου είναι ασφαλή. Με την εξέταση php.ini σας ή με τη χρήση phpinfo () μπορείτε να βρείτε τις ρυθμίσεις συνεδρία. \_session.save\_path\_ σας λέει όπου αποθηκεύονται.


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


Υποθέτοντας ότι θέλετε ακόμα να χρησιμοποιήσετε το php συνεδρία, μπορείτε να ορίσετε php να χρησιμοποιήσετε ένα άλλο φάκελο με την αλλαγή \_session.save\_path\_ ή να αποθηκεύσετε τα δεδομένα στη βάση δεδομένων αλλάζοντας \_session.save\_handler\_.


Ίσως να είναι σε θέση να καθορίσει \_session.save\_path\_ στο php.ini σας (ορισμένοι πάροχοι θα επιτρέπει) ή για apache + mod\_php, σε ένα αρχείο .htaccess στην ιστοσελίδα ριζικό φάκελο σας:
 `php_value session.save_path "/home/example.com/html/session"`. Μπορείτε επίσης να ορίσετε κατά το χρόνο εκτέλεσης με \_session\_save\_path () \_.


Ελέγξτε [φροντιστήριο Chris Shiflett του](http://shiflett.org/articles/storing-sessions-in-a-database) ή [Zend\_Session\_SaveHandler\_DbTable](http://framework.zend.com/manual/en/zend.session.savehandler.dbtable.html) να ρυθμίσετε και εναλλακτικές χειριστή συνεδρία.

 

[Αυτό το έγγραφο σταθεροποίηση συνεδρία](http://www.acros.si/papers/session_fixation.pdf) έχει πολύ καλή δείκτες, όπου επίθεση μπορεί να έρθει. Δείτε επίσης [τη σελίδα καθήλωση συνόδου στην Wikipedia](http://en.wikipedia.org/wiki/Session_fixation) .

 

Μου δύο (ή περισσότερα) cents:


* Μην εμπιστεύεσαι κανέναν
* Φίλτρο εισόδου, εξόδου διαφυγής (μπισκότο, τα δεδομένα συνεδρία εισάγονται σας πάρα πολύ)
* Αποφύγετε XSS (κρατήστε HTML σας καλά σχηματισμένα, ρίξτε μια ματιά στο [PHPTAL](http://phptal.org) ή [HTMLPurifier](http://htmlpurifier.org/) )
* [Άμυνα σε βάθος](http://en.wikipedia.org/wiki/Defense_in_Depth_%28computing%29)
* Μην εκθέτετε τα δεδομένα


Υπάρχει ένα μικρό αλλά καλό βιβλίο για το θέμα αυτό: [Βασικές PHP Ασφαλείας από τον Chris Shiflett](http://phpsecurity.org/) .


[Βασικές PHP Ασφάλεια http://shiflett.org/images/essential-php-security-small.png](http://shiflett.org/images/essential-php-security-small.png)


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


Μπορείτε να χρησιμοποιήσετε την τεχνική που αναφέρονται παραπάνω (IP & UserAgent), που περιγράφονται εδώ: [Πώς να αποφύγετε την κλοπή ταυτότητας](http://devzone.zend.com/article/11906)

 

Έθεσα συνεδρίες μου σαν αυτό-


σχετικά με την σελίδα σύνδεσης:



```
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

```

(Φράση που ορίζονται σε μια σελίδα ρυθμίσεων)


τότε στην επικεφαλίδα που είναι σε όλο το υπόλοιπο του site:



```
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}

```
 

php.ini
=======



```
session.cookie_httponly = 1
change session name from default PHPSESSID

```

eq Apache Προσθήκη κεφαλίδας:
=============================



```
X-XSS-Protection    1

```
 