Κατάσταση· Υπόβαθρο· Πρόβλημα· Λύσεις·
QA Κεντρική Σελίδα· Τελευταία Νέα· QA Πόροι· QA IG ( Ομάδα Ενδιαφέροντος)· QA WG ( Ομάδα Εργασίας)· QA Ημερολόγιο·
Γιατί η χρήση συνεδριών PHP προκαλούν τη παραγωγή μη έγκυρης HTML και XHTML, και πώς να τη φτιάξετε.
Το έγγραφο αυτό είναι ένα άρθρο που συνεισφέρει στην QA Interest Group ( Ομάδα Ενδιαφέροντος). Ανατροφοδότηση, προτάσεις και διορθώσεις είναι ευπρόσδεκτες και θα πρέπει να σταλούν στην δημόσια αρχειοθετημένη λίστα ηλεκτρονικής επικοινωνίας www-qa.
Στην HTML ( και την XHTML, μαζί με άλλες SGML και XML εφαρμογές)
συγκεκριμένοι χαρακτήρες έχουν ειδική σημασία, τρανό παράδειγμα είναι το <,
το οποίο δηλώνει την αρχή μίας ετικέτας ( tag). Τέτοιου είδους χαρακτήρες δεν μπορούν απλά να
τυπωθούν σ' ένα έγγραφο εάν θέλετε να επιδεικνύονται - αλλιώς
πώς θα μπορούσε ο χρήστης πράκτορας να διακρίνει τη διαφορά μεταξύ
b<a
(που σημαίνει ότι το b είναι μικρότερο του a) και
b<a
(που σημαίνει b ακολουθούμενο από την αρχή ενός
anchor);
Για να επιδεικνύει ειδικούς χαρακτήρες ( reserved characters) η HTML και η XHTML παρέχουν ένα μηχανισμό που ονομάζεται αναφορές χαρακτήρων ( character references). Η σύνταξη αυτών είναι:
Για παράδειγμα, ο χαρακτήρας "less than" παρουσιάζεται ως
<
.
Δίνοντας στο συμπλεκτικό σύμβολο ειδική σημασία το κάνει, όπως το <, έναν
ειδικό χαρακτήρα, άρα χρειάζεται επίσης να εκπροσωπείται από μία οντότητα
για να χρησιμοποιείται σε ένα έγγραφο - &
Τώρα μία μικρή εξομολόγηση - υπάρχουν εξαιρέσεις σ' αυτούς τους κανόνες, παρόλο που είναι άσχετες όταν αντιμετωπίζετε τα ζητήματα που προκαλούν οι συνεδρίες PHP.
Η HTML και η XHTML περιλαμβάνουν τμήματα του λεγόμενου CDATA, όπου οι ειδικοί χαρακτήρες HTML
δεν έχουν πια ειδική σημασία. Μέσα σε τέτοια τμήματα
οι αναφορές χαρακτήρων δεν είναι πλέον μεταποιημένες, άρα ένα συμπλεκτικό σύμβολο πρέπει να
τυπωθεί ως συμπλεκτικό σύμβολο και όχι ως η αναφορά του χαρακτήρα του. Στην HTML,
το περιεχόμενο των στοιχείων < σκριπτ>
και
<στυλ>
είναι το CDATA, ενώ στην XHTML
επισημαίνονται ρητά. Μπορείτε να αποφύγετε αυτά τα προβλήματα θέτοντας φύλλα σκριπτ
και στυλ σε διαφορετικούς φακέλους και χρησιμοποιώντας <σύνδεσμο ( link)>
και <script src="…">
.
Οι άλλες εξαιρέσεις είναι ότι κάποιες φορές το semicolon είναι προαιρετικό και καμιά φορά τα συμπλεκτικά σύμβολα μπορεί να εκπροσωπούνται χωρίς να κωδικοποιούνται ως οντότητες. Σε αυτές τις περιπτώσεις δεν είναι ποτέ λάθος να εκπροσωπείται ο χαρακτήρας ως αναφορά χαρακτήρα που τερματίζεται από ένα semicolon, οπότε δεν θα μπω σε περαιτέρω λεπτομέριες.
Η PHP εμπεριέχει κώδικα χειρισμού συνεδριών, κάτι το οποίο καθιστά τα δεδομένα ικανά να αποθηκεύονται στον διακομηστή αλλά να συνδέονται με έναν συγκεκριμένο χρήστη ( για, περίπου, μία επίσκεψη στον δικτυακό τόπο).
Για να συνδέσει τα δεδομένα με έναν χρήστη, ο δικτυακός τόπος πρέπει να δίνει στον χρήστη πράκτορα μία ένδειξη που να τα αναγνωρίζει. Αυτή η ένδειξη αποθηκεύεται σε ένα cookie, αλλά δεν υποστηρίζουν όλοι οι χρήστες πράκτορες cookies και οι περισσότεροι από αυτούς που χρησιμοποιούν, τους επιτρέπουν να κλείνουν.
Η PHP παρέχει έναν μηχανισμό υποχώρησης. Εάν ανακαλύψει ότι τα cookies δεν γίνονται δεκτά από τον πελάτη, ξαναγράφει κάθε σύνδεσμο στην σελίδα ώστε να συμπεριλαμβάνεται αυτή η ένδειξη σε μία query string. Πιστεύω πως αυτό γινόταν αυτόματα, αλλά δοκιμές απέδειξαν ότι, τουλάχιστον για το πακέτο Fedora της PHP 4.3.11 ( κυκλοφορία Fedora 2.4 αυτού του πακέτου), δεν γίνεται. Λειτουργεί θέτοντάς το στην οδηγία session.trans_sid .
Αυτή είναι, θεωρητικά, μία αρκετά κομψή λύση για το πρόβλημα ( παραβλέποντας τα ζητήματα που δημιουργούνται με την ένδειξη να παραμένει και για τρίτα πρόσωπα σε δημόσιους υπολογιστές, μέσω bookmarking, μοιράζοντας συνδέσμους, κλπ, κλπ), αλλά η εκτέλεση είναι ατελής.
Για συνδέσμους χωρίς query string, δεν υπάρχει πρόβλημα. Η PHP τους προσαρτεί
?PHPSESSID=
ακολουθούμενο από έναν τυχαίο αριθμό δεκαέξι ψηφίων. Για τους
συνδέσμους που έχουν query string, η PHP τους προσαρτεί
&PHPSESSID=
.
Οι χαρακτήρες συμπλεκτικών συμβόλων που χρησιμοποιούνατι ως διαχωριστές επιχειρημάτων δεν παρουσιάζουν πρόβλημα σε απλά, παλιά URLs, όμως σε URLs κωδικοποιημένα σε HTML ακόμα σημαίνουν αρχή αναφοράς χαρακτήρα ( υπόκεινται στις προαναφερθείσες εξαιρέσεις, για τις οποίες το παραπάνω παράδειγμα δεν ταιριάζει).
Οι περισσότεροι χρήστες δεν θα διακρίνουν κάποιο πρόβλημα, η πλειοψηφία από χρήστες πράκτορες είναι αρκετά καλοί στο να δουλεύουν γύρω από τα λάθη των συγγραφέων. Παρόλαυτα, δεν σημαίνει ότι οι συγγραφείς πρέπει να αγνοήσουν το πρόβλημα.
Ο χαρακτήρας που χρησιμοποιεί η PHP για να διαχωρίσει επιχειρήματα διαμορφώνεται μέσω της οδηγίας arg_separator.output. Αυτό μπορεί να τεθεί με διάφορους τρόπους και είναι η προτεινόμενη λύση στο εγχειρίδιο της PHP.
Ο φάκελος php.ini περιέχει την κεντρική διαμόρφωση δεδομένων για την εγκατάσταση της PHP σε έναν υπολογιστή. Μπορείτε να προσδιορίσετε μία αναφορά χαρακτήρα για να χρησιμοποιηθεί εκεί.
arg_separator.output = "&"
Ο διακομιστής δικτύου Apache μπορεί να θέσει τα σκριπτ της PHP σε όλα τα συνήθη μέρη. Αυτό επιτρέπει διαφορετικές οδηγίες να θέτονται σε μία ανά τόπο ή ανά κατάλογο βάση ( σε ένα, για παράδειγμα, <location> τμήμα ή σε έναν .htaccess φάκελο).
php_value arg_separator.output &
Οι οδηγίες διαμόρφωσης της PHP μπορούν να τεθούν σε μία ανά σκριπτ βάση με την λειτουργία ini_set. Βάλτε τον κώδικα να θέτει τις οδηγίες στην αρχή του σκριπτ σας.
<?php ini_set('arg_separator.output','&'); ?>
Καθώς ο χαρακτήρας συμπλεκτικού συμβόλου έχει ειδική σημασία στην HTML, οι προσδιορισμοί προτείνουν ότι οι συντακτικοί αναλυτές των query string επιτρέπουν την χρήση ενός semicolon ως διαχωριστή επιχειρημάτων. Η PHP έρχεται ήδη διαμορφωμένη για να το δέχεται αυτό, άρα μπορείτε να αλλάξετε τον κώδικα παραγωγής ώστε να χρησιμοποιεί semicolon αντί για ένα συμπλεκτικό σύμβολο, χρησιμοποιώντας τις ίδιες τεχνικές.
arg_separator.output = ";"
php_value arg_separator.output ;
<?php ini_set('arg_separator.output',';'); ?>
Αυτή η επιλογή έχει αρκετά πλεονεκτήματα από άποψη ασφάλειας καθώς μειώνει την πιθανότητα η ένδειξη της συνεδρίας να διαρρεύσει σε τρίτα πρόσωπα. Σαν παρενέργεια θα αχρηστεύσει τον κώδικα συνεδρίας σας για επισκέπτες που κλείνουν, μπλοκάρουν ή γενικά δεν υποστηρίζουν τα cookies ( υπονοούμενα περί προσβασιμότητας).
session.use_trans_sid = 0
php_value session.use_trans_sid 0
Αυτή η οδηγία ίσως τίθεται σε ανά σκριπτ βάση, αλλά ίσως και όχι, εξαρτάται ποια έκδοση της PHP χρησιμοποιείτε. Εάν είναι δυνατόν να τεθεί, τότε η σύνταξη είναι ως εξής:
<?php ini_set('session.use_trans_sid','0'); ?>