Διαφυγή από ειδικούς χαρακτήρες. Απόδραση από έναν μοναδικό χαρακτήρα

Τυπικά γλώσσες προγραμματισμού, κείμενο διεπαφές εντολών, οι γλώσσες σήμανσης κειμένου (HTML, TeX, wiki markup) ασχολούνται με δομημένο κείμενο στο οποίο ορισμένοι χαρακτήρες (και οι συνδυασμοί τους) χρησιμοποιούνται ως διαχειριστές, συμπεριλαμβανομένων εκείνων που ελέγχουν τη δομή του κειμένου. Σε μια κατάσταση όπου είναι απαραίτητο να χρησιμοποιήσετε ένα τέτοιο σύμβολο ως "σύμβολο κανονικής γλώσσας", χρησιμοποιήστε θωράκιση.

Συμβατικά, η θωράκιση μπορεί να χωριστεί σε τρεις τύπους:

  • μεμονωμένος χαρακτήρας που δραπετεύει
  • διαφυγή από μια ομάδα χαρακτήρων χρησιμοποιώντας την ακολουθία χαρακτήρων "start escaping", "end escaping"
  • χρησιμοποιώντας την ακολουθία εντολών "start escaping" και τον χαρακτήρα "end escaping", ο οποίος καθορίζεται πριν από την έναρξη του κειμένου που διαφεύγει.
Η έλλειψη θωράκισης ως αιτία ευπάθειας

Οι χαρακτήρες που δραπετεύουν ελκύουν Ιδιαίτερη προσοχή, όταν δημιουργείται αυτόματα δομημένο κείμενο. Η συμπερίληψη αυθαίρετων δεδομένων συμβολοσειράς σε κείμενο απαιτεί διαφυγή χαρακτήρων ελέγχου σε αυτό. Ταυτόχρονα, πολύ συχνά οι πραγματικές συμβολοσειρές δεν περιέχουν τέτοιους χαρακτήρες, γεγονός που επιτρέπει στον προγραμματιστή να παραλείψει εντελώς αυτήν τη λειτουργία και να λάβει περισσότερους ένα απλό πρόγραμμα, το οποίο λειτουργεί σωστά με "οποιαδήποτε εύλογα" δεδομένα συμβολοσειράς. Ωστόσο, ένας τέτοιος απλοποιημένος κώδικας έχει μια κρυφή ευπάθεια, επειδή ένα τρίτο μέρος (ο συγγραφέας των δεδομένων συμβολοσειράς) λαμβάνει μια μη εξουσιοδοτημένη ευκαιρία να επηρεάσει δομήκείμενο που δημιουργείται. Η ευπάθεια γίνεται σοβαρή εάν το κείμενο που δημιουργείται είναι πρόγραμμα κάποιου άλλου. Παραδοσιακά, τα συστήματα που χρησιμοποιούν γλώσσες SQL (δείτε SQL injection) και HTML (βλ. Cross Site Scripting) είναι επιρρεπή σε τέτοια προβλήματα.

Παραδείγματα Διαφυγής από έναν μόνο χαρακτήρα
  • Στη γλώσσα προγραμματισμού C, οι χαρακτήρες μέσα στις συμβολοσειρές διαφεύγουν χρησιμοποιώντας τον χαρακτήρα " " που τοποθετείται πριν από τον χαρακτήρα που διαγράφεται. (Σε αυτήν την περίπτωση, ο χαρακτήρας "\" μπορεί να διαφύγει από τον εαυτό του, δηλαδή ο συνδυασμός "\\" χρησιμοποιείται για την έξοδο μιας ανάστροφης κάθετου), ο ίδιος χαρακτήρας χρησιμοποιείται για τη διαφυγή χαρακτήρων στο γραμμή εντολών unix.
  • Στη γραμμή εντολών των Microsoft Windows, η διαφυγή ορισμένων χαρακτήρων γίνεται χρησιμοποιώντας τον χαρακτήρα "^" που τοποθετείται πριν από τον χαρακτήρα διαφυγής.
Απόδραση από μια ομάδα χαρακτήρων
  • Στη γλώσσα προγραμματισμού Python, η διαφυγή μιας ομάδας χαρακτήρων σε μια γραμμή πραγματοποιείται με τον καθορισμό του γράμματος r (από το αγγλικό ακατέργαστο - μη επεξεργασμένο) πριν από τη γραμμή, δηλαδή οι χαρακτήρες διαφεύγουν από ακολουθίες r"κείμενο διαφυγής "
  • Στη σήμανση wiki, η διαφυγή κειμένου γίνεται χρησιμοποιώντας ψευδοετικέτες και . Εάν χρειάζεται να γράψετε την ίδια την ψευδοετικέτα, αυτό γίνεται με χαρακτήρες μπαλαντέρ ().
Κείμενο διαφυγής με χαρακτήρα που ακολουθεί

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

  • Μετάφραση
  • Φροντιστήριο

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

Το κύριο πρόβλημα Είναι απλώς κείμενο. Ναι, μόνο το κείμενο - αυτό είναι το κύριο πρόβλημα. Σχεδόν τα πάντα σε ένα σύστημα υπολογιστή αντιπροσωπεύονται από κείμενο (το οποίο με τη σειρά του αντιπροσωπεύεται από byte). Είναι δυνατόν κάποια κείμενα να προορίζονται για υπολογιστές, ενώ άλλα για ανθρώπους. Αλλά και τα δύο εξακολουθούν να παραμένουν κείμενο. Για να καταλάβετε για τι πράγμα μιλάω, εδώ είναι ένα μικρό παράδειγμα:
Homo Sapiens Ας υποθέσουμε ότι υπάρχει το αγγλικό κείμενο, το οποίο δεν θέλω να μεταφράσω στα ρωσικά
Δεν θα το πιστέψετε: αυτό είναι κείμενο. Μερικοί το αποκαλούν XML, αλλά είναι απλώς κείμενο. Μπορεί να μην είναι κατάλληλο για εμφάνιση στον δάσκαλο. Στα Αγγλικά, αλλά εξακολουθεί να είναι απλώς κείμενο. Μπορείς να το εκτυπώσεις σε μια αφίσα και να πας με αυτό σε συλλαλητήρια, μπορείς να το γράψεις σε ένα γράμμα στη μητέρα σου... είναι κείμενο.

Ωστόσο, θέλουμε ορισμένα μέρη αυτού του κειμένου να έχουν κάποιο νόημα στον υπολογιστή μας. Θέλουμε ο υπολογιστής να μπορεί να εξάγει τον συγγραφέα του κειμένου και το ίδιο το κείμενο ξεχωριστά, ώστε να μπορούμε να κάνουμε κάτι με αυτό. Για παράδειγμα, μετατρέψτε τα παραπάνω σε αυτό:
Ας υποθέσουμε ότι υπάρχει το αγγλικό κείμενο, το οποίο δεν θέλω να μεταφράσω στα ρωσικά από τον Homo Sapiens
Πώς ξέρει ο υπολογιστής πώς να το κάνει αυτό; Λοιπόν, γιατί πολύ βολικά τυλίξαμε ορισμένα μέρη του κειμένου με ειδικές λέξεις σε αστείες παρενθέσεις, όπως και. Εφόσον το έχουμε κάνει αυτό, μπορούμε να γράψουμε ένα πρόγραμμα που αναζητά αυτά τα συγκεκριμένα μέρη, εξάγει το κείμενο και το χρησιμοποιεί για κάποια δική μας εφεύρεση.

Με άλλα λόγια, χρησιμοποιήσαμε ορισμένους κανόνες στο κείμενό μας για να υποδείξουμε κάποιο ειδικό νόημα που κάποιος άλλος, ακολουθώντας τους ίδιους κανόνες, θα μπορούσε να χρησιμοποιήσει.
Εντάξει, δεν είναι τόσο δύσκολο να το καταλάβεις. Τι γίνεται αν θέλουμε να χρησιμοποιήσουμε αυτές τις αστείες παρενθέσεις που έχουν κάποιο ιδιαίτερο νόημα στο κείμενό μας, αλλά χωρίς να χρησιμοποιήσουμε αυτό ακριβώς το νόημα;.. Κάτι σαν αυτό:
Homo Sapiens< n and y >
Οι χαρακτήρες "" δεν είναι τίποτα το ιδιαίτερο. Μπορούν νόμιμα να χρησιμοποιηθούν οπουδήποτε, σε οποιοδήποτε κείμενο, όπως στο παραπάνω παράδειγμα. Αλλά τι γίνεται με την ιδέα μας για ειδικές λέξεις, όπως; Αυτό σημαίνει ότι είναι και κάποιο είδος λέξης-κλειδιού; Σε XML - ίσως ναι. Ή μήπως όχι. Αυτό είναι διφορούμενο. Δεδομένου ότι οι υπολογιστές δεν είναι πολύ καλοί στην αντιμετώπιση ασάφειων, κάτι μπορεί να καταλήξει να δώσει ένα απροσδόκητο αποτέλεσμα, αν δεν κάνουμε κουκκίδες το i's εαυτοί μας και δεν επιλύσουμε τις ασάφειες.
Αυτό το δίλημμα μπορεί να λυθεί αντικαθιστώντας τα διφορούμενα σύμβολα με κάτι ξεκάθαρο.
Homo Sapiens Τα βασικά μαθηματικά μας λένε ότι αν x< n and y >Το n, το x δεν μπορεί να είναι μεγαλύτερο από το y.
Τώρα, το κείμενο θα πρέπει να γίνει εντελώς ξεκάθαρο. "".
Τεχνικός ορισμόςΑυτό - θωράκιση, ξεφεύγουμε από τους ιδιαίτερους χαρακτήρες όταν δεν θέλουμε να έχουν το δικό τους ιδιαίτερο νόημα.
απόδραση |iˈskāp| [όχι αντικ. ] απελευθερώνομαι [ με obj. ] να μην παρατηρώ / να μην θυμάμαι [...] [ με αντικ. ] IT: λόγος για διαφορετική ερμηνεία [...]
Εάν ορισμένοι χαρακτήρες ή ακολουθίες χαρακτήρων σε ένα κείμενο έχουν ειδικές σημασίες, τότε πρέπει να υπάρχουν κανόνες που να καθορίζουν τον τρόπο χειρισμού καταστάσεων όπου αυτοί οι χαρακτήρες πρέπει να χρησιμοποιούνται χωρίς να επικαλείται το ειδικό νόημά τους. Ή, με άλλα λόγια, η απόδραση απαντά στην ερώτηση: "Αν αυτά τα σύμβολα είναι τόσο ιδιαίτερα, πώς μπορώ να τα χρησιμοποιήσω στο κείμενό μου;".
Όπως μπορείτε να δείτε στο παραπάνω παράδειγμα, το συμπλεκτικό σύμβολο (&) είναι επίσης ένας ειδικός χαρακτήρας. Αλλά τι γίνεται αν θέλουμε να γράψουμε"


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

Αναρτήθηκε από Πλάτωνας στις 2 Ιανουαρίου, 15:31

Λέγεται ότι είπα "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laborisp nisi equaealit ut aliqua."


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

Αναρτήθηκε από Pascal στις 23 Νοεμβρίου, 04:12

Τα βασικά μαθηματικά μας λένε ότι αν x< n and y >Το n, το x δεν μπορεί να είναι μεγαλύτερο από το y.


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


Εντάξει, ΣΤΟΠ, τι στο διάολο; Κάποιος φαρσέρ εισήγαγε ετικέτες javascript στο φόρουμ σας; Όποιος κοιτάζει αυτό το μήνυμα στον ιστότοπό σας τώρα κατεβάζει και εκτελεί σενάρια στο πλαίσιο του ιστότοπού σας που μπορούν να κάνουν ποιος ξέρει τι. Και αυτό δεν είναι καλό.

Δεν πρέπει να εκληφθεί κυριολεκτικά Στις παραπάνω περιπτώσεις, θέλουμε με κάποιο τρόπο να πούμε στο DB ή στο πρόγραμμα περιήγησής μας ότι αυτό είναι απλώς κείμενο, μην κάνετε τίποτα με αυτό! Με άλλα λόγια, θέλουμε να "διαγράψουμε" ειδικές έννοιεςΟλοι ειδικοί χαρακτήρεςκαι λέξεις-κλειδιά από οποιαδήποτε πληροφορία παρέχεται από τον χρήστη, γιατί δεν τον εμπιστευόμαστε. Τι να κάνω;

Τι; Τι λες αγόρι μου; Α, λέτε, «θωράκιση»; Και έχεις απόλυτο δίκιο, πάρε ένα μπισκότο!
Εάν εφαρμόσουμε διαφυγή στα δεδομένα χρήστη πριν τα συγχωνεύσουμε με το ερώτημα, τότε το πρόβλημα λύνεται. Για τα ερωτήματα της βάσης δεδομένων μας θα είναι κάτι σαν:
$name = $_POST["όνομα"]; $name = mysql_real_escape_string($name); $query = "SELECT phone_number ΑΠΟ χρήστες WHERE name = "$name""; $result = mysql_query($query);
Μόνο μια γραμμή κώδικα, αλλά πλέον κανείς δεν μπορεί να «χακάρει» τη βάση δεδομένων μας. Ας δούμε ξανά πώς θα φαίνονται τα ερωτήματα SQL, ανάλογα με την είσοδο του χρήστη:
Άλεξ
SELECT phone_number ΑΠΟ χρήστες WHERE name = "Alex"
McDonalds
SELECT phone_number FROM users WHERE name = "Mc\"Donalds"
Joe"; DROP TABLE χρήστες; --
SELECT phone_number ΑΠΟ χρήστες WHERE name = "Joe\"; DROP TABLE χρήστες. --"
Το mysql_real_escape_string τοποθετεί αδιακρίτως μια κάθετο προς τα εμπρός μπροστά από οτιδήποτε μπορεί να έχει κάποιο ιδιαίτερο νόημα.


Εφαρμόζουμε τη συνάρτηση htmlspecialchars σε όλα τα δεδομένα χρήστη πριν την εξάγουμε. Τώρα το μήνυμα του παρασίτου μοιάζει με αυτό:

Δημοσιεύτηκε από JackTR στις 18 Ιουλίου, 12:56


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

Αυτό μας φέρνει πίσω στο... Όλα τα παραπάνω καταδεικνύουν ένα πρόβλημα κοινό σε πολλά συστήματα: το κείμενο στο κείμενο πρέπει να διαφύγει εάν δεν υποτίθεται ότι έχει ειδικούς χαρακτήρες. Κατά την τοποθέτηση τιμών κειμένου σε SQL, πρέπει να γίνεται διαφυγή σύμφωνα με τους κανόνες SQL. Κατά την τοποθέτηση τιμών κειμένου σε HTML, πρέπει να γίνεται διαφυγή σύμφωνα με τους κανόνες HTML. Κατά την τοποθέτηση τιμών κειμένου σε (όνομα τεχνολογίας), πρέπει να διαγράφονται σύμφωνα με τους κανόνες (όνομα τεχνολογίας). Αυτό είναι όλο, για λόγους πληρότητας, υπάρχουν, φυσικά, άλλοι τρόποι αντιμετώπισης των εισαγωγών χρήστη που μπορεί να περιέχουν ή όχι ειδικούς χαρακτήρες:
  • Επικύρωση
    Μπορείτε να ελέγξετε εάν η εισαγωγή χρήστη ταιριάζει με κάποια δεδομένη προδιαγραφή. Εάν θέλετε να εισαγάγετε έναν αριθμό και ο χρήστης εισάγει κάτι άλλο, το πρόγραμμα θα πρέπει να ενημερώσει τον χρήστη και να ακυρώσει την εισαγωγή. Αν όλα αυτά οργανωθούν σωστά, τότε δεν υπάρχει κίνδυνος να πιάσουμε το "DROP TABLE users" όπου ο χρήστης έπρεπε να βάλει "42". Αυτό δεν είναι πολύ πρακτικό για την αποφυγή ενέσεων HTML/SQL, επειδή... Συχνά χρειάζεται να αποδεχτείτε κείμενο ελεύθερης μορφής που μπορεί να περιέχει κόλπα. Συνήθως, η επικύρωση χρησιμοποιείται επιπρόσθετα με άλλα μέτρα.
  • Εξυγίανση
    Μπορείτε επίσης να αφαιρέσετε «αθόρυβα» όλα τα σύμβολα που θεωρείτε επικίνδυνα. Για παράδειγμα, απλώς αφαιρέστε οτιδήποτε μοιάζει με ετικέτα HTML για να αποφύγετε την προσθήκη στο φόρουμ σας. Το πρόβλημα είναι ότι μπορείτε να αφαιρέσετε απόλυτα νόμιμα μέρη του κειμένου.
    Προετοιμασμένες δηλώσεις SQL
    Υπάρχουν ειδικές λειτουργίες που κάνουν αυτό που θέλαμε: κάνουν τη βάση δεδομένων να κατανοήσει τις διαφορές μεταξύ του ίδιου του ερωτήματος SQL και των πληροφοριών που παρέχονται από τους χρήστες. Στην PHP μοιάζουν κάπως έτσι:
    $stmt = $pdo->prepare("SELECT phone_number FROM users WHERE name = ?"); $stmt->execute($_POST["name"]);
    Σε αυτήν την περίπτωση, η αποστολή γίνεται σε δύο στάδια, με σαφή διάκριση μεταξύ της αίτησης και των μεταβλητών. Η βάση δεδομένων έχει τη δυνατότητα να κατανοήσει πρώτα τη δομή του αιτήματος και μετά να το γεμίσει με τιμές.

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

3.1 Διαφυγή ειδικών χαρακτήρων

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

mysql_escape_string()

συμβολοσειρά mysql_escape_string(string $str)

Η συνάρτηση είναι παρόμοια με την άλλη συνάρτηση addslashes(), αλλά προσθέτει κάθετες πριν από ένα πιο πλήρες σύνολο ειδικών χαρακτήρων. Η πρακτική δείχνει ότι για δεδομένα κειμένου μπορείτε να χρησιμοποιήσετε τη συνάρτηση addslashes() αντί για mysql_escape_string(). Αυτό γίνεται σε πολλά σενάρια.

Σύμφωνα με το πρότυπο MySQL, οι χαρακτήρες που γράφονται στην PHP ως εξής: "\x00", "\n", "\r", "\\", """, "" και "\x1A" διαφεύγουν.

Αυτός ο αριθμός περιλαμβάνει έναν χαρακτήρα με κωδικό ASCII μηδέν, και επομένως η mysql_escape_string() μπορεί να χρησιμοποιηθεί όχι μόνο για κείμενο, αλλά και για δυαδικά δεδομένα. Μπορείτε, για παράδειγμα, να διαβάσετε μια εικόνα GIF σε μια μεταβλητή (συνάρτηση file_get_contents()) και στη συνέχεια να την εισαγάγετε στη βάση δεδομένων, έχοντας προηγουμένως διαφύγει από όλους τους ειδικούς χαρακτήρες. Όταν εξαχθεί, η εικόνα θα εμφανιστεί με την ίδια μορφή που ήταν αρχικά.

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

Χρησιμοποιώντας mysql_escape_string() ο προηγούμενος κώδικας ερωτήματος μοιάζει με αυτό:

"ΔΙΑΓΡΑΦΗ ΑΠΟ πίνακα WHERE name="".mysql_escape_string($name).""");

Είναι μακρύ, αδέξιο και άσχημο.


3.2 Πρότυπα ερωτημάτων και σύμβολα κράτησης θέσης

Ας εξετάσουμε μια άλλη λύση.

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

Οι ίδιες τιμές που θα αντικατασταθούν μεταδίδονται ξεχωριστά, πρόσθετες παραμέτρους.

Χρησιμοποιώντας την υποθετική συνάρτηση mysql_qwo, ο κώδικας της οποίας θα παρουσιαστεί παρακάτω, το προηγούμενο ερώτημα θα μπορούσε να ξαναγραφεί ως εξής:

mysql_qw("ΔΙΑΓΡΑΦΗ ΑΠΟ Πίνακα WHERE name=?", $name);

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

Η καταχώριση για το lib_mysql_qw.php περιέχει απλούστερη υλοποίησησυναρτήσεις mysql_qw() (qw - από το αγγλικό query wrapper, "query wrapper").

Υπάρχει επίσης μια βιβλιοθήκη lib/Placeholder.php που παρέχει πολύ πιο ισχυρή υποστήριξη για τη γλώσσα κράτησης θέσης: http://dklab.ru/chicken/30.html.

Στις περισσότερες περιπτώσεις, οι δυνατότητες που παρέχονται από τη συνάρτηση mysql_qw() είναι επαρκείς.

Καταχώρηση lib_mysql_qw.php

mob_info