Αυτή είναι η ελληνική μετάφραση του εγγράφου "Συμπλεκτικό Σύμβολο, Συνεδρίες PHP και Έγκυρη HTML".
Το πρωτότυπο έγγραφο βρίσκεται στη διεύθυνση http://www.w3.org/QA/2005/04/php-session.

Μετάφραση: Αντρέας Γιαννακουλόπουλος και Βασίλης Ανδρικόπουλος
Εργαστήριο Νέων Τεχνολογιών στην Επικοινωνία, την Εκπαίδευση και τα ΜME - ΕΜΜΕ, ΕΚΠΑ

Η παρούσα ελληνική έκδοση βρίσκεται στη διεύθυνση http://www.media.uoa.gr/~andreas/web/ampersands/.

Copyright
© 1999 W3C (MIT, INRIA, Keio), με την επιφύλαξη παντός νομίμου δικαιώματος. Ισχύουν οι κανόνες του W3C σχετικά με τη νομική ευθύνη, το σήμα κατατεθέν, τη χρήση του εγγράφου και την άδεια του λογισμικού.

Συμπλεκτικό Σύμβολο, Συνεδρίες PHP και Έγκυρη HTML

Γιατί η χρήση συνεδριών PHP προκαλούν τη παραγωγή μη έγκυρης HTML και XHTML, και πώς να τη φτιάξετε.

Κατάσταση αυτού του εγγράφου

Το έγγραφο αυτό είναι ένα άρθρο που συνεισφέρει στην QA Interest Group ( Ομάδα Ενδιαφέροντος). Ανατροφοδότηση, προτάσεις και διορθώσεις είναι ευπρόσδεκτες και θα πρέπει να σταλούν στην δημόσια αρχειοθετημένη λίστα ηλεκτρονικής επικοινωνίας www-qa.

Εύσημα

Συγγραφέας
David Dorward

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

Υπόβαθρο

Στην HTML ( και την XHTML, μαζί με άλλες SGML και XML εφαρμογές) συγκεκριμένοι χαρακτήρες έχουν ειδική σημασία, τρανό παράδειγμα είναι το <, το οποίο δηλώνει την αρχή μίας ετικέτας ( tag). Τέτοιου είδους χαρακτήρες δεν μπορούν απλά να τυπωθούν σ' ένα έγγραφο εάν θέλετε να επιδεικνύονται - αλλιώς πώς θα μπορούσε ο χρήστης πράκτορας να διακρίνει τη διαφορά μεταξύ b<a (που σημαίνει ότι το b είναι μικρότερο του a) και b<a (που σημαίνει b ακολουθούμενο από την αρχή ενός anchor);

Για να επιδεικνύει ειδικούς χαρακτήρες ( reserved characters) η HTML και η XHTML παρέχουν ένα μηχανισμό που ονομάζεται αναφορές χαρακτήρων ( character references). Η σύνταξη αυτών είναι:

  1. ένα συμπλεκτικό σύμβολο
  2. ένας "κωδικός" για τον χαρακτήρα που αναφέρθηκε
  3. ένα semicolon ( ";"- σύμβολο για άνω τελεία στα αγγλικά)

Για παράδειγμα, ο χαρακτήρας "less than" παρουσιάζεται ως &lt;.

Δίνοντας στο συμπλεκτικό σύμβολο ειδική σημασία το κάνει, όπως το <, έναν ειδικό χαρακτήρα, άρα χρειάζεται επίσης να εκπροσωπείται από μία οντότητα για να χρησιμοποιείται σε ένα έγγραφο - &amp;

Τώρα μία μικρή εξομολόγηση - υπάρχουν εξαιρέσεις σ' αυτούς τους κανόνες, παρόλο που είναι άσχετες όταν αντιμετωπίζετε τα ζητήματα που προκαλούν οι συνεδρίες 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.ini περιέχει την κεντρική διαμόρφωση δεδομένων για την εγκατάσταση της PHP σε έναν υπολογιστή. Μπορείτε να προσδιορίσετε μία αναφορά χαρακτήρα για να χρησιμοποιηθεί εκεί.

arg_separator.output = "&amp;"

Οδηγίες Apache

Ο διακομιστής δικτύου Apache μπορεί να θέσει τα σκριπτ της PHP σε όλα τα συνήθη μέρη. Αυτό επιτρέπει διαφορετικές οδηγίες να θέτονται σε μία ανά τόπο ή ανά κατάλογο βάση ( σε ένα, για παράδειγμα, <location> τμήμα ή σε έναν .htaccess φάκελο).

php_value arg_separator.output &amp;

Ανά σκριπτ βάση

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

<?php ini_set('arg_separator.output','&amp;'); ?>

Χρήση διαφορετικού διαχωριστή επιχειρημάτων

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

Επεξεργασία php.ini

arg_separator.output = ";"

Οδηγίες Apache

php_value arg_separator.output ;

Ανά σκριπτ βάση

<?php ini_set('arg_separator.output',';'); ?>

Θέτοντας εκτός λειτουργίας τις συνεδρίες για χρήστες χωρίς cookie

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

Επεξεργασία php.ini

session.use_trans_sid = 0

Οδηγίες Apache

php_value session.use_trans_sid 0

Ανά σκριπτ βάση

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

<?php ini_set('session.use_trans_sid','0'); ?>

Valid XHTML 1.0!
Created Date: 2005-04-15
Last modified $Date: 2005/07/11 14:35:58 $ by $Author: ot $

Copyright © 2000-2003 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark, document use and software licensing rules apply. Your interactions with this site are in accordance with our public and Member privacy statements.