Εισαγωγή στο XML-RPC. Διαγωνισμοί προγραμματισμού Τι είναι ορατό στα αρχεία καταγραφής διακομιστή


Η ανάρτησή του δείχνει επίσης πώς να κάνετε έλεγχο ταυτότητας προγράμματος περιήγησης, όπως παρακάτω:
$request = xmlrpc_encode_request ("methodName" , array("methodParam" ));
$auth = base64_encode ($username . ":" . $password );
$header = (version_compare(phpversion(), "5.2.8"))
? array("Content-Type: text/xml" , "Authorization: Basic $auth " )
: "Τύπος περιεχομένου: text/xml\r\nΕξουσιοδότηση: Βασική$auth " ; //
$context = stream_context_create (πίνακας("http" => πίνακας(
"method" => "ΑΝΑΡΤΗΣΗ" ,
"header" => $header ,
"content" => $request
)));
$webservice = "http://www.example.com/rpc";
$file = file_get_contents($webservice, false, $context);
$response = xmlrpc_decode ($file);
if (xmlrpc_is_fault($response)) (
επιστροφή "xmlrpc: $response [ faultString ] ($response [ faultCode ] )" ;
) άλλο (
επιστροφή $response ;
}
?>
1 - ΣΗΜΕΙΩΣΗ ΣΥΝΤΑΚΤΗ: ΑΥΤΗ ΕΙΝΑΙ ΜΙΑ ΕΠΙΔΙΟΡΘΩΣΗ ΑΠΟ "SandersWang dt php στο gmail dot com"

πριν από 16 χρόνια

Οι δυαδικές συμβολοσειρές (σύνολο με xmlrpc_set_type) μπαίνουν στο a ...μπλοκ όπως θα περιμένατε. Αλλά μετά από κάθε 80ο χαρακτήρα, αυτή η συνάρτηση εισάγει την οντότητα XML " ", η οποία είναι μια νέα γραμμή Unicode, σαν να προκαλεί μια αναδίπλωση γραμμής, που είναι ομολογουμένως ανόητο.

Όσο ανόητο κι αν είναι, προκαλεί πραγματικά προβλήματα σε ορισμένους διακομιστές XML-RPC, όπως http://jakarta.apache.org/xmlrpc/ (nee Helma). Αφαίρεση αυτών των οντοτήτων με κάτι σαν

$req = preg_replace("/ /", "", xmlrpc_encode_request ("my.method", $args));

λειτουργεί γύρω από το πρόβλημα.

πριν 11 χρόνια

Θα πρέπει να σημειωθεί ότι η κωδικοποίηση δεν φαίνεται να κωδικοποιεί τίποτα, απλώς καθορίστε τι μπαίνει στην κεφαλίδα XML.

Αντιμετωπίσαμε προβλήματα με τις διπλά κωδικοποιημένες συμβολοσειρές UTF που αποθηκεύτηκαν στη βάση δεδομένων κατά τη χρήση αυτής της συνάρτησης, την αποστολή τους σε έναν εξυπηρετητή apache xml-rpc και την αποθήκευση στη βάση δεδομένων mysql. Επιλύθηκε ορίζοντας το "escapeing" σε "markup" και το "encoding" σε "UTF-8" (μην ξεχάσετε να ορίσετε το "utf-8" και στο xmlrpc_decode).

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

πριν 9 χρόνια

Προσπαθήσατε ποτέ να μεταδώσετε έναν πίνακα όπως ο παρακάτω με xmlrpc;
$var1=array(7=>14,9=>18);

Ο πίνακας εξόδου φαίνεται αρκετά διαφορετικός! Θα μοιάζει με αυτό:
$var2=array(14,18);

Η μόνη λύση που βρήκα είναι να τοποθετήσω ένα κενό στο ευρετήριο:
$var3=array(" 7"=>14," 9"=>18);

Χρησιμοποιώντας αυτήν τη μέθοδο, θα έχετε το σωστό αποτέλεσμα. ($var1)

πριν από 16 χρόνια

Αυτή η συνάρτηση θα πρέπει να χρησιμοποιείται από έναν πελάτη XML-RPC για τη δημιουργία ενός ωφέλιμου φορτίου XML για ένα αίτημα XML-RPC.

$params = "system.methodSignature" ;
$method = "system.methodHelp" ;
$request = xmlrpc_encode_request ($method, $params);
ηχώ ($αίτημα);
?>

Παράγει;



system.methodΒοήθεια

system.methodΥπογραφή



Το δεύτερο όρισμα αναγνωρίζει τον τύπο της μεταβλητής και δημιουργεί τη σωστή δομή XML-RPC. Δείτε xmlrpc_encode() για περισσότερες λεπτομέρειες.

πριν 12 χρόνια

Απλός πελάτης OO με λειτουργία Υπερφόρτωση:

η μέθοδος php test_helloworld μεταφράζεται σε xmlrpc μέθοδο test.helloworld.

κλάση RpcClient(

private $_methods;
ιδιωτικό $_context;
ιδιωτική $_url;

Συνάρτηση __construct ($url, $user, $passwd) (
$auth = base64_encode(sprintf("%s:%s", $user,$passwd));
$this->_context = stream_context_create(array(
"http" => πίνακας(
"method" => "POST",
"header" => "Τύπος περιεχομένου: κείμενο/xml\r\n".
"Authorization: Basic $auth" ,

)
));
$this->_url = $url;

$this->registerMethod("Test_HelloWorld");

Συνάρτηση __call($methodName, $params) (
if (array_key_exists($methodName,$this->_methods)) (
// στο appelle la fonction RPC
$m = str_replace("_", ".", $methodName);
$r = xmlrpc_encode_request($m, $params,array("verbosity"=>"newlines_only"));
$c = $this->_context;
stream_context_set_option($c,"http","content",$r);
$f = file_get_contents($this->_url,false,$c);
$resp = xmlrpc_decode($f);
επιστροφή $resp;
) άλλο (
// στο appelle la fonction de l"objet
call_user_method_array($methodName, $this,$params);
}
}

Ιδιωτική συνάρτηση registerMethod ($method) (
$this->_methods[$method] = true;
}

Εισαγωγή στο XML-RPC

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

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

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

Ως εκ τούτου, οι προγραμματιστές κατέληξαν σε μια απόφαση - είναι απαραίτητο να αναπτυχθεί κάποιο είδος καθολικού μηχανισμού που θα επιτρέπει διαφανή (σε επίπεδο πρωτοκόλλου και μέσου μετάδοσης) και εύκολη ανταλλαγή δεδομένων μεταξύ προγραμμάτων που μπορούν να βρίσκονται οπουδήποτε, να γράφονται σε οποιαδήποτε γλώσσα και τρέχει κάτω από οποιοδήποτε λειτουργικό σύστημα, συστήματα και σε οποιαδήποτε πλατφόρμα υλικού. Ένας τέτοιος μηχανισμός ονομάζεται τώρα οι έντονοι όροι «Υπηρεσίες Ιστού», «SOAP», «αρχιτεκτονική προσανατολισμένη στις υπηρεσίες». Για την ανταλλαγή δεδομένων, χρησιμοποιούνται ανοιχτά και δοκιμασμένα με χρόνο πρότυπα - το πρωτόκολλο HTTP χρησιμοποιείται για τη μετάδοση μηνυμάτων (αν και μπορούν να χρησιμοποιηθούν άλλα πρωτόκολλα - SMTP, για παράδειγμα). Τα ίδια τα δεδομένα (στο παράδειγμά μας, οι συναλλαγματικές ισοτιμίες) μεταδίδονται συσκευασμένα σε μορφή cross-platform - με τη μορφή εγγράφων XML. Για το σκοπό αυτό, εφευρέθηκε ένα ειδικό πρότυπο - SOAP.

Ναι, τώρα οι υπηρεσίες web, το SOAP και το XML είναι στα χείλη όλων, αρχίζουν να εφαρμόζονται ενεργά και μεγάλες εταιρείες όπως η IBM και η Microsoft κυκλοφορούν νέα προϊόντα που έχουν σχεδιαστεί για να βοηθήσουν στη συνολική εφαρμογή των υπηρεσιών web.

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

Επομένως, υπάρχει ένα άλλο, θα έλεγε κανείς, εναλλακτικό πρότυπο για την ανταλλαγή πληροφοριών - XML-RPC. Αναπτύχθηκε με τη συμμετοχή της Microsoft από την UserLand Software Inc και έχει σχεδιαστεί για ενοποιημένη μεταφορά δεδομένων μεταξύ εφαρμογών μέσω Διαδικτύου. Μπορεί να αντικαταστήσει το SOAP κατά τη δημιουργία απλών υπηρεσιών όπου δεν χρειάζονται όλες οι «επιχειρηματικές» δυνατότητες των πραγματικών υπηρεσιών web.

Τι σημαίνει η συντομογραφία XML-RPC; Το RPC σημαίνει Κλήση απομακρυσμένης διαδικασίας. Αυτό σημαίνει ότι μια εφαρμογή (είτε μια δέσμη ενεργειών στον διακομιστή είτε μια κανονική εφαρμογή στον υπολογιστή-πελάτη) μπορεί να χρησιμοποιήσει με διαφάνεια μια μέθοδο που υλοποιείται και εκτελείται φυσικά σε άλλον υπολογιστή. Η XML χρησιμοποιείται εδώ για να παρέχει μια καθολική μορφή για την περιγραφή των μεταδιδόμενων δεδομένων. Ως μεταφορά, το πρωτόκολλο HTTP χρησιμοποιείται για τη μετάδοση μηνυμάτων, το οποίο σας επιτρέπει να ανταλλάσσετε απρόσκοπτα δεδομένα μέσω οποιωνδήποτε συσκευών δικτύου - δρομολογητές, τείχη προστασίας, διακομιστές μεσολάβησης.

Και έτσι, για να το χρησιμοποιήσετε πρέπει να έχετε: έναν διακομιστή XML-RPC που παρέχει μία ή περισσότερες μεθόδους, έναν πελάτη XML-RPC που μπορεί να δημιουργήσει ένα σωστό αίτημα και να επεξεργαστεί την απόκριση διακομιστή και επίσης να γνωρίζει τις απαραίτητες παραμέτρους διακομιστή για την επιτυχή λειτουργία - διεύθυνση, όνομα μεθόδου και περασμένες παράμετροι.

Όλη η εργασία με το XML-RPC πραγματοποιείται στη λειτουργία "αίτημα-απόκριση", αυτή είναι μια από τις διαφορές μεταξύ της τεχνολογίας και του προτύπου SOAP, όπου υπάρχουν και οι έννοιες των συναλλαγών και η δυνατότητα πραγματοποίησης καθυστερημένων κλήσεων (όταν ο διακομιστής αποθηκεύει το αίτημα και απαντά σε αυτό σε ορισμένο χρόνο στο μέλλον). Αυτές οι πρόσθετες λειτουργίες είναι πιο χρήσιμες για ισχυρές εταιρικές υπηρεσίες· περιπλέκουν σημαντικά την ανάπτυξη και την υποστήριξη διακομιστών και θέτουν πρόσθετες απαιτήσεις στους προγραμματιστές λύσεων πελατών.

Η διαδικασία για την εργασία με XML-RPC ξεκινά με τη διαμόρφωση ενός αιτήματος. Ένα τυπικό αίτημα μοιάζει με αυτό:

POST /RPC2 HTTP/1.0
User-Agent: eshop-test/1.1.1 (FreeBSD)
Κεντρικός υπολογιστής: server.localnet.com
Τύπος περιεχομένου: κείμενο/xml
Μήκος περιεχομένου: 172



Μέθοδος ελέγχου
Γεια σας XML-RPC!


Οι πρώτες γραμμές σχηματίζουν την τυπική κεφαλίδα αιτήματος HTTP POST. Οι απαιτούμενες παράμετροι περιλαμβάνουν τον κεντρικό υπολογιστή, τον τύπο δεδομένων (τύπος MIME), ο οποίος πρέπει να είναι κείμενο/xml και το μήκος του μηνύματος. Το πρότυπο καθορίζει επίσης ότι το πεδίο User-Agent πρέπει να συμπληρωθεί, αλλά μπορεί να περιέχει μια αυθαίρετη τιμή.

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

Γραμμή Μέθοδος ελέγχουυποδηλώνει ότι καλούμε μια μέθοδο που ονομάζεται TestMetod. Εάν είναι απαραίτητο, εδώ μπορείτε να καθορίσετε το όνομα του προγράμματος ή της ενότητας που περιέχει τη μέθοδο, καθώς και τη διαδρομή προς αυτήν. Η προδιαγραφή XML-RPC, αν και επιβάλλει ορισμένους περιορισμούς στο σύνολο των χαρακτήρων που μπορούν να χρησιμοποιηθούν για να υποδηλώσουν μια μέθοδο, ο τρόπος ερμηνείας τους εξαρτάται εξ ολοκλήρου από την υλοποίηση του διακομιστή.

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

Η περιγραφή όλων των παραμέτρων ακολουθείται από ετικέτες κλεισίματος. Το αίτημα και η απάντηση στο XML-RPC είναι κανονικά έγγραφα XML, επομένως όλες οι ετικέτες πρέπει να είναι κλειστές. Αλλά δεν υπάρχουν μεμονωμένες ετικέτες στο XML-RPC, αν και υπάρχουν στο πρότυπο XML.

Τώρα ας δούμε την απάντηση του διακομιστή. Η κεφαλίδα απόκρισης HTTP είναι κανονική· εάν το αίτημα διεκπεραιωθεί με επιτυχία, ο διακομιστής επιστρέφει μια απάντηση HTTP/1.1 200 OK. Όπως και στο αίτημα, πρέπει να καθορίσετε σωστά τον τύπο MIME, τη διάρκεια του μηνύματος και την ημερομηνία δημιουργίας απάντησης.

Το ίδιο το σώμα απόκρισης είναι το εξής:



αληθής


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

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

Τώρα ας ρίξουμε μια σύντομη ματιά στους τύπους δεδομένων στο XML-RPC. Υπάρχουν 9 τύποι δεδομένων συνολικά - επτά απλοί τύποι και 2 σύνθετοι. Κάθε τύπος περιγράφεται από τη δική του ετικέτα ή σύνολο ετικετών (για σύνθετους τύπους).

Απλοί τύποι:

Ολόκληροι αριθμοί- ετικέτα ή ;

Τύπος Boolean- ετικέτα , μπορεί να πάρει και τις δύο τιμές 0/1 και true/false.

Συμβολοσειρά ASCII- περιγράφεται με ετικέτα και μπορεί να περιέχει μια αυθαίρετη συμβολοσειρά χαρακτήρων.

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

ημερομηνία και ώρα- περιγράφεται με ετικέτα και πρέπει να συμμορφώνεται με τη μορφή iso8601. Για περαιτέρω επεξεργασία σε σενάρια, αυτή η μορφή είναι λίγο άβολη, επομένως μετατρέπεται πάντα κατά την αποστολή/λήψη ενός αιτήματος. Αυτό μπορεί να γίνει από μια ειδική λειτουργία εντός της βιβλιοθήκης ή, εάν δεν υπάρχει, ο προγραμματιστής πρέπει να μετατρέψει την ημερομηνία με μη αυτόματο τρόπο.

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

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

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

Φυσικά, κάποιος θα πει ότι μια τέτοια λίστα τύπων δεδομένων είναι πολύ φτωχή και «δεν σας επιτρέπει να επεκταθείτε». Ναι, εάν χρειάζεται να μεταφέρετε σύνθετα αντικείμενα ή μεγάλες ποσότητες δεδομένων, τότε είναι καλύτερο να χρησιμοποιήσετε το SOAP. Και για μικρές, μη απαιτητικές εφαρμογές, το XML-RPC είναι αρκετά κατάλληλο· επιπλέον, πολύ συχνά ακόμη και οι δυνατότητές του αποδεικνύονται πάρα πολλές! Λαμβάνοντας υπόψη την ευκολία ανάπτυξης, έναν πολύ μεγάλο αριθμό βιβλιοθηκών για σχεδόν οποιαδήποτε γλώσσα και πλατφόρμα, και την ευρεία υποστήριξη στην PHP, τότε το XML-RPC συχνά απλά δεν έχει ανταγωνιστές. Αν και δεν μπορεί να προταθεί αμέσως ως καθολική λύση - σε κάθε συγκεκριμένη περίπτωση πρέπει να αποφασίζεται ανάλογα με τις περιστάσεις.

Η τεχνολογία XML-RPC χρησιμοποιείται στο σύστημα WordPress για διάφορες ωραίες λειτουργίες όπως pingbacks, trackbacks, απομακρυσμένη διαχείριση ιστότοπου χωρίς σύνδεση στον πίνακα διαχείρισης κ.λπ. Δυστυχώς, οι εισβολείς μπορούν να το χρησιμοποιήσουν για να πραγματοποιήσουν επιθέσεις DDoS σε ιστότοπους. Δηλαδή, δημιουργείτε όμορφα, ενδιαφέροντα έργα WP για τον εαυτό σας ή για παραγγελία, και ταυτόχρονα, χωρίς να υποψιάζεστε τίποτα, μπορείτε να είστε μέρος ενός botnet DDoS. Συνδέοντας δεκάδες και εκατοντάδες χιλιάδες ιστότοπους μαζί, οι κακοί άνθρωποι δημιουργούν μια ισχυρή επίθεση στο θύμα τους. Αν και ταυτόχρονα υποφέρει και ο ιστότοπός σας, επειδή... το φορτίο πηγαίνει στο hosting όπου βρίσκεται.

Απόδειξη μιας τέτοιας κακής δραστηριότητας μπορεί να είναι στα αρχεία καταγραφής διακομιστή (access.log στο nginx), που περιέχει τις ακόλουθες γραμμές:

103.238.80.27 - - "POST /wp-login.php HTTP/1.0" 200 5791 "-" "-"

Αλλά ας επιστρέψουμε στην ευπάθεια XML-RPC. Οπτικά, εκδηλώνεται με το αργό άνοιγμα των τοποθεσιών στον διακομιστή σας ή την αδυναμία να τους φορτώσετε καθόλου (502 Bad Gateway error). Η τεχνική υποστήριξη του οικοδεσπότη μου FASTVPS επιβεβαίωσε τις εικασίες μου και συμβούλεψε:

  1. Ενημερώστε το WordPress στην πιο πρόσφατη έκδοση μαζί με πρόσθετα. Γενικά, αν ακολουθήσετε, ίσως έχετε διαβάσει για την ανάγκη εγκατάστασης της πιο πρόσφατης έκδοσης 4.2.3. λόγω επικρίσεων ασφαλείας (όπως και οι προηγούμενες εκδόσεις). Εν ολίγοις, είναι καλό να ενημερώνεστε.
  1. Εγκαταστήστε το πρόσθετο Disable XML-RPC Pingback.

Απενεργοποίηση XML-RPC στο WordPress

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

Βρείτε και πραγματοποιήστε λήψη του Disable XML-RPC Pingback ή εγκαταστήστε το απευθείας από τον πίνακα διαχείρισης του συστήματος. Δεν χρειάζεται να διαμορφώσετε τίποτα επιπλέον, η μονάδα αρχίζει να λειτουργεί αμέσως. Καταργεί τις μεθόδους pingback.ping και pingback.extensions.getPingbacks από τη διεπαφή XML-RPC. Επιπλέον, αφαιρεί το X-Pingback από τις κεφαλίδες HTTP.

Σε ένα από τα ιστολόγια βρήκα μερικές ακόμη επιλογές για την κατάργηση της απενεργοποίησης XML-RPC.

1. Απενεργοποιήστε το XML-RPC στο πρότυπο.

Για να το κάνετε αυτό, προσθέστε την ακόλουθη γραμμή στο αρχείο functions.php του θέματος:

Order Deny, Allow Deny από όλους

Προσωπικά δεν χρησιμοποίησα τις δύο τελευταίες μεθόδους, γιατί... Συνέδεσα το πρόσθετο Disable XML-RPC Pingback - νομίζω ότι θα είναι αρκετό. Μόνο για όσους δεν τους αρέσουν οι περιττές εγκαταστάσεις, πρότεινα εναλλακτικές επιλογές.

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

Όταν το κατάλαβα, αποδείχτηκε ότι οι κωδικοί πρόσβασης ήταν βίαια + πολλά αιτήματα προς το XMLRPC.

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

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

1. Σταματήστε την αναζήτηση, εγκαταστήστε το πρόσθετο Limit Login Attempts - εγκαταστήστε το, καθώς άλλες προστασίες επιβραδύνουν σημαντικά τον διακομιστή, για παράδειγμα, όταν χρησιμοποιείτε το πρόσθετο Login Security Solution, ο διακομιστής πέθανε μετά από μισή ώρα, η προσθήκη φορτώνει πολύ τη βάση δεδομένων .

Στις ρυθμίσεις, φροντίστε να ενεργοποιήσετε το πλαίσιο ελέγχου "Για διακομιστή μεσολάβησης" - διαφορετικά θα καθορίσει την IP του διακομιστή σας για όλους και θα αποκλείσει αυτόματα όλους.
ΕΝΗΜΕΡΩΣΗ, ευχαριστώ, οι λεπτομέρειες βρίσκονται παρακάτω στα σχόλια - ενεργοποιήστε το πλαίσιο ελέγχου "Για διακομιστή μεσολάβησης" μόνο εάν ο ορισμός δεν λειτουργεί όταν είναι ενεργοποιημένη η "Άμεση σύνδεση"

2. Απενεργοποιήστε το XML-RPC - το πρόσθετο Disable XML-RPC (είναι εύκολο να ενεργοποιηθεί και αυτό είναι).

3. Κλείστε το wp-login.php - εάν έχετε πρόσβαση στον ιστότοπο μέσω IP, το πρόσθετο δεν λειτουργεί και οι επιλογείς συνεχίζουν να καταρρέουν τον ιστότοπο. Για να αποφύγετε αυτό, προσθέστε στο .htaccess:

Order Deny, Allow Deny από όλους

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

Μετά από αυτά τα 3 απλά βήματα, οι τοποθεσίες άρχισαν να πετούν ξανά και ήρθε η ειρήνη.

Λοιπόν, ξαφνικά είναι ενδιαφέρον

Μία από τις επιλογές είναι να δείτε αν δέχεστε επίθεση. Αυτό μπορεί να φανεί στα αρχεία καταγραφής nginx (για παράδειγμα, εδώ είναι η διαδρομή για το αρχείο Debian /var/log/nginx Access.log).

Το WordPress είχε πάντα ένα ενσωματωμένο εργαλείο για την απομακρυσμένη πρόσβαση στον ιστότοπό σας. Πράγματι, μερικές φορές χρειάζεται να φτάσετε στον ιστότοπό σας, αλλά ο υπολογιστής σας απέχει πολύ από εσάς. Για πολύ καιρό, η λύση ήταν ένα αρχείο που ονομάζεται xmlrpc.php. Ωστόσο, τα τελευταία χρόνια αυτό το αρχείο έχει γίνει περισσότερο πρόβλημα παρά λύση.

Παρακάτω θα ρίξουμε μια πιο προσεκτική ματιά στο xmlrpc.php και γιατί δημιουργήθηκε. Θα εξετάσουμε επίσης τα κοινά ζητήματα ασφαλείας που μπορεί να προκαλέσει και πώς να τα διορθώσετε για τον ιστότοπό σας στο WordPress.

Το XML-RPC είναι μια δυνατότητα του WordPress που επιτρέπει τη μεταφορά δεδομένων, με το HTTP να χρησιμεύει ως μεταφορά και το XML για κωδικοποίηση. Δεδομένου ότι το WordPress δεν είναι ένα κλειστό σύστημα και συχνά επικοινωνεί με άλλα συστήματα, έχουν βρεθεί λύσεις για αυτό το πρόβλημα.

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

Η κύρια λειτουργία του xmlrpc.php είναι η δυνατότητα σύνδεσης στον ιστότοπο από smartphone, η υλοποίηση trackbacks και linkbacks από άλλους ιστότοπους και ορισμένες λειτουργίες που σχετίζονται με το πρόσθετο Jetpack.

Γιατί δημιουργήθηκε το Xmlrpc.php και πώς χρησιμοποιήθηκε;

Η εφαρμογή του XML-RPC πηγαίνει πολύ πίσω στις πρώτες μέρες του WordPress και ακόμη και πριν το WordPress γίνει WordPress.

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

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

XML-RPC σήμερα

Το 2008, με την έκδοση 2.6 του WordPress, εισήχθη μια επιλογή για την ενεργοποίηση ή απενεργοποίηση του XML-RPC. Ωστόσο, με την κυκλοφορία της εφαρμογής WordPress iPhone, η υποστήριξη XML-RPC ήταν ενεργοποιημένη από προεπιλογή και δεν υπήρχε επιλογή απενεργοποίησής της. Έτσι παραμένει και σήμερα.

Φυσικά, η λειτουργικότητα που παρέχεται από αυτό το αρχείο έχει μειωθεί σημαντικά με την πάροδο του χρόνου και το μέγεθος του αρχείου έχει μειωθεί από 83kb σε 3kb, δεν παίζει πλέον ρόλο όπως πριν.

Ιδιότητες XML-RPC

Με τη νέα διεπαφή προγραμματισμού εφαρμογών WordPress (API), μπορούμε να περιμένουμε ότι το XML-RPC θα απενεργοποιηθεί πλήρως. Σήμερα αυτό το νέο API βρίσκεται ακόμα σε δοκιμή και μπορεί να ενεργοποιηθεί μόνο μέσω ειδικής προσθήκης.

Αν και μπορείτε να περιμένετε ότι το API θα συμπεριληφθεί απευθείας στον πυρήνα του WordPress στο μέλλον, εξαλείφοντας εντελώς την ανάγκη για xmlrpc.php.

Το νέο API δεν είναι τέλειο, αλλά παρέχει καλή, αξιόπιστη ασφάλεια, σε αντίθεση με το xmlrpc.php.

Γιατί να απενεργοποιήσετε το Xmlrpc.php

Το μεγαλύτερο πρόβλημα με το XML-RPC είναι η ασφάλεια. Το πρόβλημα δεν σχετίζεται άμεσα με το XML-RPC, αλλά μπορεί να χρησιμοποιηθεί για την ενεργοποίηση μιας επίθεσης στον ιστότοπό σας.

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

Υπάρχουν δύο βασικές αδυναμίες του XML-RPC που έχουν γίνει αντικείμενο εκμετάλλευσης στο παρελθόν.

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

Το δεύτερο είναι να θέσετε τον ιστότοπο εκτός σύνδεσης μέσω μιας επίθεσης DDoS. Οι χάκερ θα χρησιμοποιήσουν την αντίστροφη ειδοποίηση στο WordPress για να την στείλουν σε χιλιάδες ιστότοπους ταυτόχρονα. Αυτή η λειτουργία xmlrpc.php δίνει στους χάκερ σχεδόν άπειρο αριθμό διευθύνσεων IP για να διαδώσουν μια επίθεση DDoS.

Για να ελέγξετε εάν το XML-RPC λειτουργεί στον ιστότοπό σας, μπορείτε να το εκτελέσετε χρησιμοποιώντας ένα εργαλείο που ονομάζεται XML-RPC Validator. Εκτελέστε τον ιστότοπό σας με το εργαλείο και αν εμφανιστεί σφάλμα, σημαίνει ότι δεν έχετε υποστήριξη XML-RPC.

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

Μέθοδος 1: Απενεργοποιήστε το Xmlrpc.php χρησιμοποιώντας μια προσθήκη

Η απενεργοποίηση του XML-RPC στον ιστότοπό σας στο WordPress είναι απίστευτα εύκολη.

Μεταβείτε στην ενότητα Πρόσθετα › Προσθήκη νέουστην κονσόλα διαχειριστή του WordPress. Βρείτε ένα πρόσθετο Απενεργοποιήστε το XML-RPCκαι εγκαταστήστε το, μοιάζει με την παρακάτω εικόνα:

Ενεργοποιήστε το πρόσθετο και τελειώσατε. Αυτό το πρόσθετο θα εισαγάγει αυτόματα τον απαραίτητο κώδικα για την απενεργοποίηση του XML-RPC.

Ωστόσο, να θυμάστε ότι τα εγκατεστημένα πρόσθετα ενδέχεται να χρησιμοποιούν τμήματα του XML-RPC και, στη συνέχεια, η απενεργοποίησή του μπορεί να προκαλέσει διένεξη μεταξύ των προσθηκών ή των μεμονωμένων τμημάτων τους και να τα βγάλει εκτός λειτουργίας.

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

  • Σταματήστε την επίθεση XML-RPC. Αυτή η προσθήκη θα σταματήσει όλες τις επιθέσεις XML-RPC, αλλά θα επιτρέψει σε προσθήκες όπως το Jetpack και άλλα αυτοματοποιημένα εργαλεία και πρόσθετα να συνεχίσουν να εκτελούνται, δίνοντάς τους πρόσβαση σε αρχεία xmlrpc.php.
  • Έλεγχος XML-RPC Publishing. Αυτό σας επιτρέπει να διατηρείτε τον έλεγχο και να δημοσιεύετε εξ αποστάσεως.

Μέθοδος 2: Απενεργοποιήστε το Xmlrpc.php με μη αυτόματο τρόπο

Εάν δεν θέλετε να χρησιμοποιήσετε ένα πρόσθετο και προτιμάτε να το κάνετε χειροκίνητα, ακολουθήστε αυτήν την προσέγγιση. Θα σταματήσει όλα τα εισερχόμενα αιτήματα xmlrpc.php πριν περάσουν στο WordPress.

Ανοίξτε το αρχείο .htaccess. Ίσως χρειαστεί να ενεργοποιήσετε την "εμφάνιση κρυφών αρχείων" στον διαχειριστή αρχείων σας ή στο πρόγραμμα-πελάτη FTP για να βρείτε αυτό το αρχείο.

Επικολλήστε αυτόν τον κώδικα στο αρχείο .htaccess:

# Αποκλεισμός αιτημάτων WordPress xmlrpc.php άρνηση παραγγελίας, αποδοχή άρνησης από όλα τα επιτρεπόμενα από 123.123.123.123

Τελικές σκέψεις

Συνολικά, το XML-RPC ήταν μια σταθερή λύση σε ορισμένα από τα προβλήματα που προέκυψαν με την απομακρυσμένη δημοσίευση στον ιστότοπό σας στο WordPress. Ωστόσο, την ίδια στιγμή, εμφανίστηκαν κάποιες τρύπες ασφαλείας που αποδείχθηκαν αρκετά επικίνδυνες για ορισμένους ιδιοκτήτες ιστότοπων WordPress.

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

Με την πάροδο του χρόνου, μπορούμε να περιμένουμε ότι η λειτουργικότητα XML-RPC θα ενσωματωθεί σε ένα νέο API του WordPress που θα υποστηρίζει την απομακρυσμένη πρόσβαση χωρίς να θυσιάζεται η ασφάλεια.

Έχετε αποκλείσει την πρόσβαση στο XML-RPC μέσω μιας προσθήκης ή με μη αυτόματο τρόπο; Ή μήπως υπήρχαν προβλήματα ασφαλείας επειδή ήταν προηγουμένως ενεργό; Μοιραστείτε την εμπειρία σας στα σχόλια παρακάτω.