“Άσε ήσυχη την PHP μου!”

Οι σημερινοί web servers έχουν γίνει ιδιαίτερα αρθρωτοί (modular, στη “βαρβαρική” :P) κάτι το οποίο τους επιτρέπει να δέχονται πολλές προεκτάσεις. Μία από αυτές είναι και η PHP: Hypertext Preprocessor η οποία, σύμφωνα με περσινές στατιστικές, χρησιμοποιείται σε περισσότερους από τους μισούς Apache web servers εκεί έξω.

Η PHP, ως δυναμική scripting γλώσσα, εκτελείται πρώτα στον server και το αποτέλεσμα αποστέλλεται στον χρήστη που ζήτησε τη σελίδα. Από τη στιγμή που καλούμαστε να φτιάξουμε εμπορικές εφαρμογές πάνω σε αυτή, πρέπει να λάβουμε υπ’ όψη ορισμένους κινδύνους που κρύβουν οι διάφορες “ευκολίες” της.

Συμβουλή πρώτη: ποτέ μα ποτέ μη δείχνετε τον κώδικά σας σε κα-νέ-ναν! Όσοι δεν ξέρουν PHP δε θα καταλάβουν έτσι κι αλλιώς, ενώ όσοι ξέρουν μπορεί να βρουν κάποιο πρόβλημα και αντί να σας το πουν, να το εκμεταλλευτούν! Αν θέλετε να ζητήσετε συμβουλές επειδή κολλήσατε απίστευτα τότε αλλάξτε όλα τα ονόματα μεταβλητών, αντικαταστήστε με τελίτσες όσα μπορούν να εννοηθούν και μην αναφέρετε πουθενά σε ποιο domain πρόκειται να χρησιμοποιηθεί ο κώδικας! U never know..

Συμβουλή δεύτερη: σιγουρευτείτε ότι η μεταβλητή register_globals του php.ini στον web server όπου έχετε τις σελίδες σας έχει την τιμή Off. Μην προτιμήσετε όσους την έχουν On και μη σχεδιάσετε το web app σας με κάτι τέτοιο σαν δεδομένο (οι πρόσφατες εκδόσεις της γλώσσας το έχουν by default απενεργοποιημένο, διαβάστε τα σχόλια στο .ini).

Συμβουλή τρίτη: για να δούμε και λίγο κώδικα! Έστω πως κάνατε και τα δύο προηγούμενα λάθη :P και κάποιος είδε ότι υπάρχει μια ξεχασμένη μεταβλητή $file που ενσωματώνει κάποιο error log στον browser, αλλά μόνο όταν έχει τιμή η μεταβλητή. Κάπως έτσι δηλαδή: //$file=”error.log”; if (isset($file)) include($file); Επειδή την έχετε κάνει comment out, το if δέχεται false και δεν κάνει include το αρχείο. Κάποιος “έξυπνος” χρήστης θα μπορούσε να περάσει το $file σαν παράμετρο δίπλα στη διεύθυνση και να το ενεργοποιήσει εκτυπώνοντας κάποιο σοβαρό αρχείο του δίσκου (π.χ. το γνωστό /etc/passwd αν παίζουμε με *NIX ή ακόμα χειρότερα, κάποιο δικό του script από remote server!).

Με την κατάλληλη παράμετρο βλέπουμε το boot.ini
Με την κατάλληλη παράμετρο βλέπουμε το boot.ini

Μία αυστηρή αλλά ξεκάθαρη λύση είναι να φτιάξετε ένα array με όλα τα πιθανά ονόματα που θα μπορούσε να περιμένει το εκάστοτε include σαν παράμετρο και αν αυτό που πάει να ανοιχτεί δεν συμπεριλαμβάνεται εκεί, να κάνετε άμεσα die()!. Και ποτέ μην δίνετε απλά .inc κατάληξη σε αρχεία με settings ή functions επειδή μπορούν να ανοιχτούν σαν plain text από κάποιον που ξέρει το όνομά τους. Να προτιμάτε το .inc.php και να εισάγετε τα περιεχόμενά τους ανάμεσα σε <?php … ?> tags.

Μπήκαμε στη σελίδα νόμιμα με το account μας (user1)
Μπήκαμε στη σελίδα νόμιμα με το account μας (user1)

Συμβουλή τέταρτη και πιο σοβαρή: για όσους παίζουν με cookies (τα οποία δεν συνίστανται ιδιαίτερα τώρα που έχουμε τα sessions, αλλά χρησιμοποιούνται ακόμη σε περιπτώσεις). Αν κάνετε κάποιο χρήστη login και περάσει τον έλεγχο με επιτυχία, μη θέσετε απλά ένα cookie με το username του (π.χ. setcookie(“username”, $username);) και μετά πάρετε σαν δεδομένο ότι αυτός είναι “πάει και τελείωσε”. Με λίγες πολύ απλές JavaScript “εντολούλες”, ο καθένας μπορεί να αλλάξει τις τιμές των cookies του browser του και από απλός χρήστης να γίνει π.χ. admin!

Τρέξαμε ένα JavaScript που αλλάζει το value του cookie
Τρέξαμε ένα JavaScript που αλλάζει το value του cookie

Σώστε το cookie με περισσότερες τιμές (π.χ. username, password, expiration time, συγκεκριμένο domain κλπ.) και κάθε φορά που χρειάζεται να χρησιμοποιήσετε το username του χρήστη σε κάποιο action (π.χ. αλλαγή στοιχείων ή κωδικού), να ξανακάνετε έλεγχο αληθείας στα στοιχεία που υπάρχουν σωσμένα.

Και πλέον είμαστε ο administrator! :)
Και πλέον είμαστε ο administrator! :)

Η PHP είναι μια εύχρηστη όσο και επικίνδυνη scripting γλώσσα που μπορεί να γίνει το καλύτερο εργαλείο στα κατάλληλα χέρια.

upON

 

(Εκδόθηκε τον Φεβρουάριο του 2006 στο ένθετο “ΧAKER”, τεύχος 00000001, του περιοδικού RAM)