internet pencereler Android
Genişletmek

Neden XMLRPC PHP dosyasına ihtiyacınız var? Programlama Yarışmaları

Birkaç gün önce, sitelerimin barındırmasında yükünün zaman zaman büyüdüğünü fark ettim. Genellikle 100-120 "papağan" (CP) bölgesinde ise, son birkaç gün boyunca 400-500 CP'ye yükselmiştir. Bu konuda iyi bir şey yok, çünkü hoster daha pahalı bir tarife çevirebilir ve hatta sitelere erişimi bile kapsayabilir, bu yüzden anlamaya başladım.

Ancak XML-RPC işlevselliğini kaydetmenizi sağlayan bir yöntem seçtim: XML-RPC Pingback eklentisinin devre dışı bırakılması. Sadece "tehlikeli" yöntemleri pingback.ping ve pingback.extensions.getpingbacks, XML-RPC işlevselliğini bırakır. Eklentiyi taktıktan sonra, yalnızca etkinleştirmeniz gerekir - başka bir yapılandırma gerekmez.

Yol boyunca, tüm IP saldırganlarını file.htaccess'e erişmelerini engellemek için attı. Dosyanın sonunda yeni bitti:

Tüm indeksleri 5.196.5.116 37.59.120.214 92.222.35.159

Hepsi bu, şimdi blogu xmlrpc.php kullanarak daha fazla saldırıda güvenle koruduk. Sitelerimiz istekleri ile göndermeyi ve ayrıca DDOS üçüncü taraf sitelerine saldırı.

WordPress, sitenize uzaktan erişim için her zaman gömülü bir araç olmuştur. Nitekim, bazen sitenize ulaşmanız gerekir ve bilgisayar sizden uzak. Uzun süredir, çözelti xmlrpc.php tarafından yapıldı. Ancak, geçen yıl bu dosya çözümden daha büyük bir sorun haline geldi.

Aşağıda XMLRPC.PHP'yi ve neden oluşturulduğunu ayırt edeceğiz. Ayrıca, neden olabileceği ortak güvenlik sorunlarını ve siteniz için Wordpress'te nasıl düzeltileceğini de düşüneceğiz.

XML-RPC, kodlama için HTTP çıkıntılarından veri aktarmanızı sağlayan bir WordPress işlevidir. WordPress kapalı bir sistem olmadığı ve genellikle diğer sistemlerle iletişim kurduğundan, bu görev için çözümler bulundu.

Örneğin, sitenizi cep telefonunuzdan yayınlamak istediğinizi söyleyelim. XMLRPC.PHP tarafından sağlanan uzaktan erişim kullanmanız gerekir.

Ana fonksiyonel XMLRPC.PHP, siteye akıllı telefondan, diğer sitelerden gelen trackbakes ve linkbilerin uygulanmasını ve jetpack eklentisi ile ilişkili bazı fonksiyonlardan bağlanma yeteneğidir.

Xmlrpc.php neden yaratıldı ve nasıl kullanıldı?

XML-RPC'nin uygulanması WordPress'in ilk günlerinde ve WordPress WordPress haline gelmeden önce uzağa uzanır.

İnternetin yalnızca son zamanlarda ortaya çıktığı günlere geri dönen, bağlantılar çok yavaştı ve web'deki kayıt işlemi ve yayını çok daha zordu. Tarayıcıdan derhal değişiklik yapmak yerine, çoğunluk onları theline'da yaptı ve sonra kopyalandı ve içeriğini çevrimiçi olarak ekledi. Ve bu süreç idealden uzaktı.

Çözüm (o zaman), içeriğinizi oluşturabileceğiniz çevrimdışı bloglama için bir müşterinin oluşturulmasıydı, sonra blogunuza bağlanın ve yayınlayın. Bu bağlantı XML-RPC ile gerçekleştirildi. XML RPC'nin ana işlevselliği ile, benzer bağlantıları kullanan erken uygulamalar, insanlara WordPress sitelerini diğer cihazlardan girme fırsatı sağladı.

Bugün XML RPC

2008 yılında, sürüm 2.6 WordPress ile, XML-RPC Açık ve Kapalı seçeneği belirdi. Bununla birlikte, iPhone için WordPress uygulamasının serbest bırakılmasıyla, XML-RPC desteği varsayılan olarak etkinleştirildi ve kapatma imkanı yoktu. Bu yüzden bugün kalır.

Tabii ki, bu dosya tarafından sağlanan işlevsellik zaman içinde önemli ölçüde azalmış ve dosya boyutu 83kb'den 3kb'den düştü, artık daha önce olduğu gibi böyle bir rol oynamıyor.

XML-RPC özellikleri

WordPress uygulamasının (API) yeni bir programlama arayüzüyle, XML-RPC'nin tamamen devre dışı bırakılmasını bekleyebiliriz. Bugün, bu yeni API hala test aşamasında ve yalnızca özel bir eklentiye dahil edilebilir.

Her ne kadar API'yi doğrudan gelecekte Wordpress çekirdeğinde bekleyebilseniz de, XMLRPC.php kullanma ihtiyacını tamamen ortadan kaldırır.

Yeni API mükemmel değil, ancak XMLRPC.php'in aksine iyi güvenilir koruma sağlar.

Neden XMLRPC.PHP'yi devre dışı bırakın?

XML-RPC ile ilişkili en büyük sorun güvenliktir. Sorun doğrudan XML-RPC ile ilgili değildir, ancak sitenizdeki saldırıyı açmak için kullanılabilir.

Tabii ki çok güvenilir bir şifre şifresini ve güvenlik sağlayan WordPress eklentilerini koruyabilirsiniz. Ancak en iyi koruma modu basitçe kapatacaktır.

Geçmişte kullanılan XML-RPC'nin iki ana zayıflığı vardır.

İlk - saldırıyı, sitenize erişmek için şifrenin (kaba kuvvet saldırıları) doğrudan seçimiyle kullanır. Saldırgan, XMLRPC.php kullanarak sitenize erişmeye çalışacaktır. Kullanıcı adları ve şifrelerin çeşitli kombinasyonlarını seçme. Yüzlerce farklı şifreyi test etmek için bir ekibi etkili bir şekilde kullanabilirler. Bu, genellikle doğrudan seçimin saldırılarını tespit eden ve engelleyen güvenlik araçlarını atlamalarını sağlar.

İkincisi - Sitenin çevirisi DDOS saldırısı ile çevrimdışı. Bilgisayar korsanları, aynı anda binlerce site göndermek için WordPress'deki geri bildirimi kullanacaklar. Bu XMLRPC.PHP işlevselliği, DDOS saldırısını dağıtmak için neredeyse sonsuz miktarda IP adresi olan bilgisayar korsanlarını verir.

XML-RPC'nin sitenizde çalışıp çalışmadığını kontrol etmek için, XML-RPC validator adı verilen aracı kullanarak çalıştırabilirsiniz. Aracınızı kullanarak web sitenizi çalıştırın ve bir hata mesajı alırsanız, XML-RPC desteğine sahip olmadığınız anlamına gelir.

Başarılı bir tamamlama mesajı alırsanız, XMLRPC.php'ü aşağıdaki iki yaklaşımdan birini durdurabilirsiniz.

Yöntem 1: Eklenti ile xmlrpc.php bağlantı kesilmesi

WordPress sitenizdeki XML-RPC'yi devre dışı bırakın İnanılmaz derecede kolaydır.

Bölümüne gitmek Eklentiler\u003e Yeni Ekle WordPress Yönetici Konsolu'nda. Eklenti bulmak XML-RPC'yi devre dışı bırak Ve yükleyin, aşağıdaki resimde görünüyor:

Eklentiyi etkinleştirin ve her şey hazır. Bu eklenti, XML-RPC'yi devre dışı bırakmak için gerekli kodu otomatik olarak ekler.

Bununla birlikte, yüklü eklentilerin XML-RPC'nin parçalarını kullanabileceğini ve ardından kapanması, bir eklenti veya bireysel parçalar ve çalışma modundan çıktı çıkışına neden olabilir.

Sadece bireysel XML-RPC elemanlarını devre dışı bırakmak istiyorsanız, ancak diğer eklentilerin ve işlevlerin çalışmasına izin verirseniz, bu eklentilere bakın:

  • XML-RPC saldırısını durdur. Bu eklenti tüm XML-RPC saldırılarını durdurur, ancak bu tür eklentilerin çalışmasına JetPack ve diğer otomatik aletler ve eklentiler olarak çalıştırılmasına izin verilir, bunları XMLRPC.PHP dosyalarına erişim sağlar.
  • XML-RPC yayıncılığını kontrol edin. Bu, kontrolden tasarruf etmenizi ve uzaktan yayınlanmasını sağlar.

Yöntem 2: XMLRPC.php'ü elle ayırın

Eklentiyi kullanmak istemiyorsanız ve manuel olarak yapmayı tercih ederseniz, bu yaklaşımı izleyin. WordPress'e aktarılmadan önce gelen tüm XMLRPC.php isteklerini durduracak.

Dosyayı aç. HTAccess. Bu dosyayı bulmak için Dosya Yöneticisi veya FTP istemcisine 'Gizli Dosyaları Göster'i etkinleştirmeniz gerekebilir.

Bu kodu dosyaya ekleyin .htaccess.:

# Blok wordpress xmlrpc.php istekleri Sipariş reddetmek, inkar izin vererek izin verilen 123.123.123.123

Son düşünceler

Genel olarak, XML-RPC, WordPress web sitenizdeki uzak bir yayından dolayı ortaya çıkan bazı sorunlar için iyi bir çözümdür. Bununla birlikte, aynı zamanda, bazı site sahipleri için WordPress'deki bazı site sahipleri için oldukça tehlikeli olan bazı güvenlik delikleri ortaya çıktı.

Sitenizin güvenli olmasını sağlamak için, uzak yayın ve jetpack eklentisi için gerekli bazı işlevlere ihtiyacınız yoksa, XMLRPC.php'ü tamamen devre dışı bırakmanız önerilir. Ardından, güvenlik deliklerini düzeltirken, bu işlevleri kullanmanıza izin veren bypass eklentilerini kullanabilirsiniz.

Zamanla, XML-RPC fonksiyonlarının, güvenlikten ödün vermeden uzaktan erişimi destekleyecek olan yeni WordPress API'ye entegre edilmesini bekleyebiliriz.

XML-RPC'ye eklenti veya manuel olarak erişimi engellediniz mi? Veya ilk aktif olduğu gerçeğinden dolayı güvenlik ile ilgili herhangi bir probleminiz var mı? Deneyiminizi aşağıdaki yorumlarda paylaşın.


Mesajı ayrıca aşağıdaki gibi tarayıcı kimlik doğrulamasının nasıl yapılacağını gösterir:
$ istedi \u003d xmlrpc_encode_Request ("MethodName", dizi ("MethodParam"));
$ AUTH \u003d Base64_encode ($ kullanıcı adı. ":" $ Şifre);
$ Header \u003d (version_compare (phpversac (), "5.2.8")))
? Dizi ("İçerik Türü: Metin / XML", "Yetkilendirme: Temel $ Auth")
: "İçerik türü: metin / xml \\ r \\ nauthorization: temel$ AUTH "; //
$ Context \u003d Stream_Context_Create (dizi ("http" \u003d\u003e dizi (
"Yöntem" \u003d\u003e "Gönderi",
"Header" \u003d\u003e $ Başlık,
"İçerik" \u003d\u003e $ istek
)));
$ WebService \u003d. "http://www.example.com/rpc";
$ file \u003d file_get_contents ($ WebService, False, $ bağlam);
$ Yanıt \u003d XMLRPC_DECODE ($ dosya);
if (xmlrpc_is_fault ($ Yanıt)) (
Geri dönün "XMLRPC: $ Yanıt [Arızalı] ($ Tepki [Arıza])";
) BAŞKA (
$ Yanıt Ver;
}
?>
1 - Editör Not: Bu "Sanderswang DT PHP Gmail Dot Com" dan bir düzeltmedir.

16 yıl önce.

İkili dizeler (xmlrpc_set_type ile ayarlayın) ... Sizin gibi blok "D bekleniyor. Ancak her 80. karakterinden sonra, bu fonksiyon, XML şirketi olan XML varlığını ekler", yani bir satır sargısına neden olan bir satır sargısına neden olur.

Aptal olsa da, http://jakarta.apache.org/xmlrpc/ (Nee Helma) gibi bazı XML-RPC sunucuları için gerçek sorunlara neden olur. Bu varlıkları gibi bir şeyle soymak

$ Req \u003d preg_replace ("/ /", "", xmlrpc_encode_request ("My.Method", $ args));

sorunun etrafında çalışır.

11 yıl önce.

Kodlamanın hiçbir şeyi kodlamadığı görülmediği belirtilmelidir, sadece XML başlığına neler yaptığını belirtin.

Bu funche kullanırken, bir Apache XML-RPC servletini gönderirken ve MySQL veritabanında depolayan, bu funche'yu kullanırken, çift kodlu UTF dizeleri ile ilgili sorunumuz vardı. "Kaçan", "İşaretleme" ve "Kodlamayı" "UTF-8" olarak ayarlanarak çözüldü (XMLRPC_DECODE 'de "UTF-8" olarak ayarlamayı unutmayın).

UTF-8 kodlu dizelerinin, baytlarını, karakterleri yerine varlıklar olarak nitelendiriyor gibi görünüyor.

9 yıl önce.

Hiç XMLRPC ile aşağıdakiler gibi bir diziyi iletmeyi denedim mi?
$ var1 \u003d dizi (7 \u003d\u003e 14.9 \u003d\u003e 18);

Çıkış dizisi oldukça farklı görünüyor! Böyle görünecek:
$ var2 \u003d dizi (14,18);

Bulduğum tek çözüm, dizine bir boşluk bırakmaktır:
$ var3 \u003d dizi ("7" \u003d\u003e 14, "9" \u003d\u003e 18);

Bu yöntemi kullanarak doğru sonucu elde edersiniz. ($ Var1)

16 yıl önce.

Bu fonksiyon, bir XML-RPC isteği için bir XML yükü oluşturmak için bir XML RPC istemcisi tarafından kullanılmalıdır;

$ params \u003d "system.methodsignature";
$ Metodhod \u003d "system.methodhelp";
$ Gereken \u003d XMLRPC_ENCODE_REQUEST ($ yöntem, $ params);
echo ($ istek);
?>

Üretir;



system.methodhelp.

system.MethodSignature.



İkinci argüman değişken türünü tanır ve doğru XML-RPC yapısını oluşturur. Daha fazla ayrıntı için XMLRPC_ENCODE () bölümüne bakın.

12 YIL ÖNCE.

Fonksiyon aşırı yükü olan basit OO istemcisi:

pHP Metho Test_Hellogorld, XMLRPC yöntemine tercüme edildi. Hellogorld.

sınıf rpcclient (

Özel $ _METHODS;
Özel $ _Context;
Özel $ _URL;

İşlev __Construct ($ url, $ user, $ passwd) (
$ AUTH \u003d Base64_encode (SprintF ("% S:% s", $ kullanıcı, $ passwd));
$ Bu -\u003e _ Context \u003d Stream_Context_Create (Dizi ()
"http" \u003d\u003e dizi (
"Yöntem" \u003d\u003e "Gönderi",
"Header" \u003d\u003e "İçerik türü: metin / xml \\ r \\ n".
"Yetkilendirme: Temel $ auth",

)
));
$ Bu -\u003e _ url \u003d $ URL;

$ BU-\u003e RegisterMethod ("Test_Heloworld");

Fonksiyon __call ($ metodname, $ params) (
if (array_key_exists ($ metodname, $ bu -\u003e _ yöntemler)) (
// Appelle La Fonchion RPC'de
$ M \u003d str_replace ("_", ".", $ Metodname);
$ r \u003d xmlrpc_encode_Request ($ M, $ params, dizi ("verbity" \u003d\u003e "newlines_only"));
$ C \u003d $ bu -\u003e _ bağlam;
Stream_Context_Set_Option ($ c, "http", "İçerik", $ R);
$ f \u003d file_get_contents ($ this -\u003e _ url, false, $ c);
$ Resp \u003d XMLRPC_DECODE ($ F);
$ İade;
) BAŞKA (
// appelle la fonchion de l "objet
call_user_method_array ($ metodname, $ bu, $ params);
}
}

Özel İşlev RegisterMethod ($ yöntem) (
$ Bu -\u003e _ yöntemler [$ yöntem] \u003d doğru;
}

Öğlen, cumartesi günleri sunucumda, WordPress'in yaklaşık 25 sitesinde barındırılacağı, vahşi frenler başladı. Önceki saldırılardan kurtulmayı başardığım için (,) fark edilmedi, derhal ne olduğunu anlamadım.

Dikkat ettiğimde, şifrelerin XMLRPC'ye pek çok istek geçtiği ortaya çıktı.

Sonuç olarak, derhal olmasa da, bunu kesmek mümkündü. Kedi üç basit teknik, nasıl önlenir.

Bu teknikler muhtemelen herkes tarafından bilinir, ancak açıklamalarda bulamadığım birkaç komisyon için geldim - aniden birisine zaman kazandıracak.

1. Büstü, Limit Oturum Açma Girişimleri Eklentisi - Koyun, diğer koruma sunucuyu güçlü bir şekilde asıldığından, örneğin, giriş güvenlik çözümü eklentisini kullanırken, sunucu yarım saat sonra öldü, eklentiyi veritabanını çok yüklüyor.

Ayarda, "Proxy için" testini açtığınızdan emin olun - aksi takdirde, sunucunuzun IP'ini herkes için tanımlayacak ve hepsini otomatik olarak engelleyecektir.
Güncelleme, Teşekkürler, Teşekkürler, Yorumlarda aşağıdaki detaylar - "Proxy için" bir kene, yalnızca "Doğrudan Bağlantı" etkinleştirildiğinde tanımlanmazsa açın.

2. XML RPC'yi çıkarın - XML-RPC eklentisini devre dışı bırakın (basitçe onu ve her şeyi etkinleştirin).

3. WP-login.php'ü kapatın - Site ile IP üzerinden başvurursanız, eklenti çalışmaz ve turşular DAB sitesine devam eder. Bunu önlemek için, v.htaccess ekleyin:

Sipariş reddet, hepsinden inkar izin ver

WP-Login dosyası kopyalanır, herhangi bir garip adı, örneğin poletnormalny.php ve dosya içinde otomatik şanzıman ile tüm yazıtlar wp-login.php ile poletnormalny.php.
Hepsi, şimdi yalnızca dosyanızdaki yönetici ile iletişim kurabilirsiniz.

Bu 3 basit adımdan sonra, siteler tekrar uçmaya başladı ve sakinleşti.

İyi, aniden ilginç

Ne saldırdığını görmek için bir seçenek. Bu, NGINX günlüklerinde görülebilir (örneğin, Debian / var / log / nginx dosyası Access.log) için yolun yoludur.

XML-RPC'ye Giriş

Ağda, kullanıcılara belirli bilgiler sağlayan birçok farklı kaynak vardır. Sıradan statik sayfalar yok, ancak örneğin, veritabanından veya arşivlerden alınan veriler. Bu, finansal verilerin bir arşivi (döviz kurları, menkul kıymetler tekliflerinin verileri), hava durumu verileri veya daha hacimli bilgiler - forumlardan haberler, makaleler, mesajlar. Bu tür bilgiler sayfanın ziyaretçisine, örneğin, formda, isteğe cevap olarak veya her zaman dinamik olarak oluşturmak mümkün olduğunda sunulabilir. Ancak zorluk, çoğu zaman bu tür bilgilerin bu kadar çok kullanıcısı olmamasıdır - bu verilerin, bu verilerin hesaplamaları veya diğer ihtiyaçları için kullanacağı programları, programları ne kadar kullanacağıdır.

GERÇEK ÖRNEK: Para birimi alıntılarının gösterildiği bankacılık sitesinin sayfası. Sayfaya normal bir kullanıcı olarak giderseniz, tarayıcı aracılığıyla, sayfanın, afişlerin, menülerin tümünü ve "Framents" olan diğer bilgilerin tasarımını görürseniz, aramanın gerçek hedefi para birimdir. Bu teklifleri çevrimiçi mağazanıza yapmanız gerekirse, istediğiniz verileri manuel olarak seçip, panoya sitenize hareket ettirirken başka hiçbir şey kalmayacaktır. Ve her gün yapmalıyım. Çıkış yok mu?

Eğer soruna "alnında" karar verirseniz, çözüm hemen önerir: Veriler için gerekli olan program (Sitedeki Sitede), sunucudan "sıradan bir kullanıcı" olarak bir sayfa alır (pars) ) Elde edilen HTML kodu ve bunun için gerekli bilgileri vurgular. Bu, sıradan bir düzenli ifade ile veya herhangi bir HTML ayrıştırıcısıyla yapılabilir. Yaklaşımın karmaşıklığı onun yetersizliğindedir. İlk olarak, küçük bir veri bölümünü elde etmek için (para birimleri üzerindeki veriler kelimenin tam anlamıyla diger karakterlerdir) tüm sayfayı almanız gerekir ve bu, en az birkaç on kilobayt. İkincisi, sayfa kodundaki herhangi bir değişiklikle, örneğin, tasarım değişmiş veya başka bir şey, analiz algoritmamız tekrarlamak zorunda kalacaktır. Evet ve kaynaklar seçilecektir.

Bu nedenle, geliştiriciler kararlara geldi - şeffaf bir şekilde (protokol ve iletim ortamının düzeyinde) izin verecek bir evrensel mekanizma geliştirmek gereklidir ve herhangi bir yerde olabilecek programlar arasında veri alışverişinde bulunmak kolaydır. Dil ve herhangi bir ameliyathane sistemlerinin kontrolü altında ve herhangi bir donanım platformunda çalışın. Böyle bir mekanizma şu anda "Web Servisleri" (Web Servisi), "SOAP", "Servis odaklı mimarisi) yüksek sesli terim olarak adlandırılır. Veri değişimi için, açık ve zaman testi standartları kullanılır - HTTP mesajları göndermek için (örneğin diğer protokolleri kullanabilmeniz de - SMTP). Verilerin kendisi (örneğimize - döviz kurlarımızda), XML belgeleri olarak Platform Platform Formatına paketlenmiştir. Bunun için özel bir standart icat edilir - sabun.

Evet, şimdi web hizmetleri, sabun ve XML işitme için hepsine sahip olduklarında, IBM ve Microsoft gibi hem büyük şirketlerin hem de web servislerinin toplam uygulanmasına yardımcı olmak için tasarlanmış yeni ürünler üretmeye aktif olarak tanıtmaya başlarlar.

Fakat! Çevrimiçi mağaza motorundaki banka sitesinden bulaşması gereken para birimi kursları ile birlikte, böyle bir çözüm çok karmaşık olacaktır. Sonuçta, sadece SOAP standardının açıklaması, bir buçuk bin bin sayfa uygun değil ve hepsi bu değil. Pratik kullanım için, hala üçüncü taraf kütüphaneler ve uzantılarla çalışmanız gerekir (yalnızca PHP 5.0 ile başlamak için sabunla çalışmak için bir kütüphane içerir), yüzlerce ve binlerce satır kodlarını yazmanız gerekir. Ve tüm bunlar birkaç harf ve sayı elde etmek için - açıkça çok ağır ve mantıksızdır.

Bu nedenle, başka bir tane var, gerginlikle bilgi alışverişi için alternatif bir standart söyleyebilirsin - XML-RPC. Microsoft'un UserLand Software Inc şirketinin katılımıyla tasarlanmıştır ve uygulamalar arasında internet üzerinden birleşik veri aktarımı için tasarlanmıştır. Bu web hizmetlerinin tüm "kurumsal" özelliklerinin gerekli olmadığı basit hizmetler oluştururken sabunun yerini alabilir.

XML-RPC kısaltması ne anlama geliyor? RPC uzaktan prosedür çağrısı olarak şifresi çözülür - Uzaktan Prosedür Araması. Bu, uygulamanın (ne olursa olsun, sunucudaki komut dosyasının veya istemci bilgisayardaki normal uygulamanın) başka bir bilgisayarda fiziksel olarak uygulanan ve yürütülen bir yöntem kullanılması anlamına gelir. Burada XML, iletilen verilerin açıklamasının evrensel bir tanımını sağlamak için kullanılır. Taşıma olarak, HTTP protokolü, herhangi bir ağ aygıtları, güvenlik duvarları, proxy sunucuları aracılığıyla verileri serbestçe değiştirmenizi sağlayan mesaj göndermek için uygulanır.

Ve böylece, kullanım için, bir veya daha fazla yöntem sağlayan XML-RPC sunucusu, XML-RPC istemcisi, doğru bir istek oluşturabilen ve sunucu yanıtını işleme koyabilecek ve ayrıca için gereken sunucu parametrelerini bilmeniz yeterlidir. Başarılı iş - adres, yöntem adı ve yöntem iletilen parametreler.

XML RPC'li tüm çalışmalar "İstek-Yanıt" modunda gerçekleşir, bu, işlemlerin kavramları olduğu ve ertelenmiş aramaları yapabilme yeteneğinin (sunucunun talebi kaydetme ve yanıt vermesi durumunda) gelecekte belirli bir zamanda). Bu ek özellikler güçlü kurumsal hizmetler için daha faydalı olacaktır, sunucuların gelişimini ve desteğini önemli ölçüde zorlarlar ve müşteri karar alma geliştiricileri için ek gereklilikler koyarlar.

XML RPC ile çalışma prosedürü, bir sorgunun oluşumu ile başlar. Tipik bir istek şöyle görünür:

Post / rpc2 http / 1.0
Kullanıcı Aracısı: ESHOP-TEST / 1.1.1 (FREEBSD)
Ana Bilgisayar: server.localnet.com.
İçerik türü: Metin / XML
İçerik-uzunluk: 172



Testmetod.
Merhaba, XML-RPC!


İlk satırlarda, standart HTTP istek başlığı oluşturulur. Zorunlu parametreler, mesajın uzunluğu ve mesajın uzunluğu olması gereken ana bilgisayar, veri türü (MIME tipi) içerir. Ayrıca, standart, kullanıcı aracı alanının doldurulması gerektiğini, ancak keyfi bir değer içerebilir.

Sonra normal XML belge başlığıdır. Kök elemanı sorgulama - Sadece bir tane olabilir ve bu tür düğümleri iştirakler olarak içeremez. Bu, bir isteğin sunucuda yalnızca bir yöntem olarak adlandırılabileceği anlamına gelir.

Hat Testmetod. TestMetod adlı yöntemi aradığımızı gösterir. Gerekirse, burada yöntemi içeren programın veya modülün adını da belirtebilirsiniz. Spesifikasyon XML-RPC, yöntemin gösterilebileceği karakter kümesinde bazı sınırlamalar getirmesine rağmen, ancak bunları nasıl yorumlayabileceği, ancak bunların nasıl yorumlanacağı - tam olarak sunucunun uygulanmasına bağlıdır.

Sonra iletilen parametrelere ayarlanır. Bunun için bölüme hizmet eder Keyfi sayıda alt element içerebilir Etiket tarafından açıklanan bir parametre içeren . Parametreler ve veri türleri Biraz daha bakacağız. Sürümümüzde, etikette bulunan bir dize parametresi iletilir. .

Tüm parametreleri tanımladıktan sonra, kapanış etiketlerini takip ediyorsunuz. XML-RPC'ye istek ve yanıt, bunlar normal XML belgeleridir, bu nedenle tüm etiketler kapanmalıdır. Ancak, XML-RPC'de tek bir etiket yoktur, ancak XML standardında bulunurlar.

Tetimer Sunucu yanıtını analiz edeceğiz. HTTP Yanıt Başlığı, istek başarıyla işlenirse, sunucu Cevap HTTP / 1.1 200 OK döndürür. Ayrıca, sorguda olduğu gibi, MIME türünü, mesajın uzunluğunu ve yanıt tarihinin tarihini doğru şekilde belirlemelisiniz.

Vücudun kendisi aşağıdaki gibidir:



doğru.


Şimdi kök etiketi yerine etiketi gösterir Sorgu işlem sonuçlarının hemen yatırıldığı. Ne yazık ki, cevap, yöntem yöntemi ile iletilmez, bu nedenle çeşitli yöntemler aynı anda neden olursa, karışıklığı önlemek için istemci tarafında kaydetmelisiniz.

İsteğinizi işleme koyarken bir hata oluştuğunda, Cevap bir unsur olacak Hatayı açıklayan yapının ekleneceği. Bir hata açıklaması, sayısal bir hata kodu ve metin açıklaması içerir.

Ve şimdi XML-RPC'deki veri türlerini kısaca göz önünde bulundurun. Toplam veri türleri 9 - yedi basit tip ve 2 karmaşıktır. Her tip etiketi veya bir etiket kümesiyle tanımlanır (karmaşık tipler için).

Basit tipler:

Tüm sayılar - Etiket veya ;

Mantıksal tip - Etiket Hem 0/1 ve True / False değerini de alabilir;

ASCII-dize - Etiketi açıklar ve keyfi bir karakter dizisi içerebilir;

Kayan nokta sayıları - Etiket Ayrıca sayının bir işareti içerebilir, kesirli parça bir nokta ile ayrılır;

tarih ve saat - Etiketi açıklar ve ISO8601 formatına uymak zorundadır. Komut dosyalarında daha fazla işleme için, böyle bir format biraz rahatsız edicidir, bu nedenle bir sorgu gönderir / alırken her zaman dönüştürülür. Bu, kütüphanenin bir parçası olarak özel bir özellik yapabilir veya değilse, geliştirici bir tarihi manuel olarak dönüştürmelidir.

Son basit tip base64'te kodlanmış dizeEtiket tarafından açıklanan . Bu tür evrenseldir, bununla birlikte, böyle bir kodlama nedeniyle iletilen verilerin miktarı artarsa, istemci ile sunucu arasındaki herhangi bir veri iletebilirsiniz. Ancak bu, protokolün ve özellikle XML formatının metninin doğası gereğidir.

Karmaşık türler yapılar ve diziler ile temsil edilir. Yapı kök eleman tarafından belirlenir keyfi sayıda eşya içerebilir yapının her bir üyesini tanımlamak. Yapının üyesi iki etiketle açıklanmaktadır: ilk , üyenin adını, ikincisi, , Bir üye değeri içerir (veri türünü tanımlayan bir etiketle birlikte).

Dizilerin isimleri yoktur ve etiketi açıklamıyor bir eleman içeren ve bir veya daha fazla bağlı ortaklık belirli verilerin belirtildiği yer. Bir dizi, çok boyutlu dizileri tanımlamanıza olanak tanıyan diğer dizilerin yanı sıra rastgele sırayla diğer diziler içerebilir. Bir dizi yapıyı da tanımlayabilirsiniz. Ancak, dizinin bir adına sahip olmadığı gerçeği, bazı durumlarda kullanımı, karmaşık verilerin aktarılması için, diğer türlerde tekrar tekrar paketlenmeleri gerekir (örneğin, birkaç diziyi iletmek için, her bir dizinin ayrı olarak paketlenebilir. yapı ve sonra bu yapılardan bir dizi oluşturun).

Tabii ki, biri böyle bir veri türlerinin bir listesinin çok zayıf olduğunu ve "etrafını dönmenize izin vermiyor" diyor. Evet, karmaşık nesneleri veya büyük miktarda veri iletmeniz gerekiyorsa, sabun kullanmak daha iyidir. Ve küçük, iddiasız uygulamalar için, XML-RPC tamamen uygundur, dahası, yetenekleri bile çok sık ortaya çıkar! Dağıtım kolaylığını dikkate alırsak, hemen hemen her dil ve platform için çok sayıda kütüphane, PHP'de geniş destek, daha sonra XML-RPC'nin genellikle rakibi yoktur. Her ne kadar onu evrensel bir çözüm olarak tavsiye etmemesi imkansız olmasına rağmen, her özel durumda koşullarda çözmek gerekir.