Mga kumpetisyon sa programming. Pag-parse ng XML sa PHP Masusing xmlrpc php

Ang mga hacker ay naghahanap ng iba't ibang paraan para i-hack ang iyong mga website. Sa karamihan ng mga kaso, maliban kung ang site ay may ilang komersyal na halaga, ito ay mga bata na naglalaro, sinusubukang igiit ang kanilang sarili.

Noong isang araw, ang aking mga nagho-host na site ay, sa madaling salita, "nakalatag." Malinaw na ang ilan sa mga site ay DOSed.

Ito ay makikita pangunahin mula sa mga istatistika ng paggamit ng mapagkukunan ng server:

Nagulat ako sa kadahilanang walang komersyal na mapagkukunan sa pagho-host. Bakit, maaaring magtanong, DOS ba ito? Para saan?

Ano ang ipinapakita ng diagram?

Sa unang larawan nakita namin ang pag-load ng CPU. Ito ay sinusukat sa 100% bawat core. Nagsimula ang pag-atake bandang 15:00 GMT, at bandang 21:00 ay hiniling ko sa provider na gumawa ng isang bagay tungkol dito. Ang teknikal na suporta ay nagsimulang maglipat ng pagho-host sa isa pang master server. Tila para bigyan ako ng pagkakataong gumamit ng mas maraming mapagkukunan ng system. Mga 10:00 p.m. nagsimula ang paglipat, tinitingnan ang integridad ng mga file at iba pang mga pamamaraan.

Hindi ko talaga gustong mag-abala - at natulog na lang ako, dahil "ang umaga ay mas matalino kaysa sa gabi."

Ano ang nakikita sa mga log ng server?

Ang mga istatistika ngayong umaga ay hindi na nagpakita ng anumang mga anomalya. Ang mga site ay nagbubukas pa rin sa bawat iba pang oras at hindi kaagad, i.e. nagpatuloy ang pag-atake. Maaaring ang mga istatistika ay isinusulat pa rin mula sa lumang server, o ang mga ito ay data na mula sa master server...

Samakatuwid, nagpatuloy ako sa pag-aaral ng mga log upang malaman kung saan sila "kumakatok."

Nang tingnan ko ang mga log, naging malinaw na hindi na kailangang mag-alala - kumakatok ang ilang uri ng shkolota mula sa parehong IP address sa /xmlrpc.php ng ​​isa sa aking mga WordPress site. Malamang na brute-forcing niya ang admin password.

Siyempre, hindi ito masyadong kaaya-aya, dahil ang lahat ng iba pang mga site ng virtual server ay "nagsisinungaling" din. At ang pinaka-nakakainis na bagay ay hindi ko ginagamit ang mga serbisyong XML na ito sa alinman sa aking mga WP site.

Hinaharang ang XML RPC.

Ang pinakasimpleng bagay na maaari mong gawin sa sitwasyong ito ay tanggalin ang file mula sa root folder ng site /xmlrpc.php. Ang server, kung hindi ito makakahanap ng isang squeak, ay hindi tatakbo ng PHP, pag-aaksaya ng mga mapagkukunan ng memorya at oras ng processor. Ang solusyon ay simple, ngunit hindi maganda. Una, maaaring gumamit ang isang tao ng mga kakayahan ng RPC. Halimbawa, mag-publish ng mga post sa site sa pamamagitan ng isa sa maraming kliyente ng Weblog. At pangalawa, ang file ay maibabalik pagkatapos ng susunod na pag-update ng WP.

Kung tumatakbo ang iyong server sa Apache, maaari mong harangan ang pag-access sa xmlrpc.php nang hindi tinatanggal ang file mismo. Kailangan mong idagdag ang mga sumusunod na tagubilin sa simula ng iyong .htaccess file sa root directory ng WordPress site. Haharangan nito ang pag-access sa file mula sa anumang mga address.

# XML-RPC DDoS PROTECTION Order Deny, Allow Deny from all

# XML-RPC DDoS PROTECTION

< FilesMatch "^(xmlrpc\.php)" >

Utos Tanggihan, Payagan

Tanggihan mula sa lahat

< / FilesMatch >

Sa aking kaso, posibleng i-block lamang ang IP address ng pinagmulan ng kahilingan, dahil... parehong address ang ginamit. Upang harangan lamang ang IP address ng "shkolodoser":

Order Allow, Deny Deny from 85.93.93.157 Allow from All

< FilesMatch "^(xmlrpc\.php)" >

Order Allow, Deny

Tanggihan mula sa 85.93.93.157

Payagan mula sa Lahat

< / FilesMatch >

Ngunit kung gumagamit ka ng RPC, maaari kang lumikha ng puting listahan ng mga address na may access sa script xmlrpc.php.

I-order Deny, Allow #add your IP adresses Allow from 127.0.0.1 Allow from XX.XX.XX.XX ... Tanggihan mula sa lahat

Paggamit ng XML-RPC sa PHP upang mag-publish ng mga materyales sa LiveJournal.com (LJ)

Una, kakailanganin mong i-download ang XML-RPC library. Para sa akin, ang pinakamatagumpay na bersyon ay malayang ipinamamahagi sa pamamagitan ng sourceforge " ": Lahat ng mga halimbawa sa ibaba ay ibibigay para sa library na ito, bersyon 2.2.

Ano ang XML-RPC? Ang RPC ay nangangahulugang Remote Procedure Call, maaari itong isalin sa Russian bilang remote procedure na tawag gamit ang XML. Ang remote procedure call technique mismo ay kilala sa mahabang panahon at ginagamit sa mga teknolohiya tulad ng DCOM, SOAP, CORBA. Idinisenyo ang RPC para sa pagbuo ng mga distributed client-server application. Ginagawa nitong posible na bumuo ng mga application na gumagana sa magkakaibang mga network, halimbawa, sa mga computer ng iba't ibang mga system, upang maisagawa ang malayuang pagproseso ng data at pamahalaan ang mga malalayong aplikasyon. Sa partikular, ang protocol na ito ay ginagamit ng kilalang website na livejournal.com sa Russia.

Tingnan natin ang isang halimbawa kung paano ka makakapaglagay ng isang Cyrillic na entry (at dito madalas lumitaw ang mga problema) sa LiveJournal. Nasa ibaba ang gumaganang code na may mga komento:

bagong xmlrpcval($pangalan, "string"), "password" => bagong xmlrpcval($password, "string"), "kaganapan" => bagong xmlrpcval($text, "string"), "paksa" => bagong xmlrpcval ($subj, "string"), "lineendings" => new xmlrpcval("unix", "string"), "year" => new xmlrpcval($year, "int"), "mon" => new xmlrpcval( $mon, "int"), "day" => new xmlrpcval($day, "int"), "hour" => new xmlrpcval($hour, "int"), "min" => new xmlrpcval($min , "int"), "ver" => new xmlrpcval(2, "int")); /* lumikha ng isang istraktura batay sa array */ $post2 = array(new xmlrpcval($post, "struct")); /* lumikha ng XML na mensahe para sa server */ $f = new xmlrpcmsg("LJ.XMLRPC.postevent", $post2); /* ilarawan ang server */ $c = new xmlrpc_client("/interface/xmlrpc", "www.livejournal.com", 80); $c->request_charset_encoding = "UTF-8"; /* opsyonal na tingnan ang XML code ng kung ano ang ipapadala sa server */ echo nl2br(htmlentities($f->serialize())); /* magpadala ng XML na mensahe sa server */ $r = $c->send($f); /* suriin ang resulta */ if(!$r->faultCode()) ( /* matagumpay na natanggap ang mensahe at ibinalik ang resulta ng XML */ $v = php_xmlrpc_decode($r->value());print_r($v); ) else ( /* nagbalik ang server ng error */ print "May naganap na error: "; print "Code: ".htmlspecialchars($r->faultCode()); print "Reason: "".htmlspecialchars($r->faultString ( )).""\n"; ) ?>

Sa halimbawang ito, isang paraan lamang ang LJ.XMLRPC.postevent - isang kumpletong listahan ng mga posibleng command at ang kanilang syntax (sa Ingles) ay available sa:

Simula sa tanghali ng Sabado, ang aking server, kung saan humigit-kumulang 25 na mga site ng Wordpress ang naka-host, ay nagsimulang makaranas ng matinding paghina. Dahil nakaligtas ako sa mga nakaraang pag-atake ( , ) nang hindi napapansin, hindi ko agad naintindihan ang nangyayari.

Nang malaman ko ito, lumabas na ang mga password ay pinipilit + maraming kahilingan sa XMLRPC.

Bilang resulta, nagawa naming putulin ang lahat, bagaman hindi kaagad. Narito ang tatlong simpleng trick kung paano ito maiiwasan.

Ang mga diskarteng ito ay malamang na kilala ng lahat, ngunit natapakan ko ang ilang mga pagkakamali na hindi ko nakita sa mga paglalarawan - marahil ito ay makatipid ng oras ng isang tao.

1. Itigil ang paghahanap, i-install ang Limit Login Attempts plugin - i-install ito, dahil ang ibang mga proteksyon ay lubos na nagpapabagal sa server, halimbawa, kapag ginagamit ang Login Security Solution plugin, namatay ang server pagkatapos ng kalahating oras, ang plugin ay naglo-load nang husto sa database .

Sa mga setting, tiyaking i-on ang checkbox na "Para sa proxy" - kung hindi, matutukoy nito ang IP ng iyong server para sa lahat at awtomatikong i-block ang lahat.
I-UPDATE, salamat, ang mga detalye ay nasa ibaba sa mga komento - paganahin ang checkbox na "Para sa proxy" lamang kung ang kahulugan ay hindi gumagana kapag ang "Direktang koneksyon" ay pinagana

2. Huwag paganahin ang XML-RPC - ang Huwag paganahin ang XML-RPC plugin (madaling i-activate at iyon lang).

3. Isara ang wp-login.php - kung na-access mo ang site sa pamamagitan ng IP, hindi gagana ang plugin at patuloy na i-crash ng mga picker ang site. Upang maiwasan ito, idagdag sa .htaccess:

Order Deny, Allow Deny from all

Kinokopya namin ang wp-login file, palitan ang pangalan nito sa anumang kakaibang pangalan, halimbawa poletnormalny.php, at sa loob ng file, gumamit ng autocorrect para baguhin ang lahat ng wp-login.php inscriptions sa poletnormalny.php.
Iyon lang, maaari mo na ngayong ma-access ang admin panel gamit lamang ang iyong file.

Matapos ang 3 simpleng hakbang na ito, nagsimulang lumipad muli ang mga site at dumating ang kapayapaan.

Well, biglang naging kawili-wili

Isa sa mga pagpipilian ay upang makita kung ikaw ay inaatake. Ito ay makikita sa nginx logs (halimbawa, narito ang path para sa Debian /var/log/nginx access.log file).

Panimula sa XML-RPC

Mayroong maraming iba't ibang mga mapagkukunan sa Internet na nagbibigay sa mga user ng ilang partikular na impormasyon. Hindi ito nangangahulugan ng mga ordinaryong static na pahina, ngunit, halimbawa, ang data na nakuha mula sa isang database o mga archive. Ito ay maaaring isang archive ng data sa pananalapi (mga rate ng palitan, data ng mga securities quote), data ng panahon, o mas maraming impormasyon - mga balita, artikulo, mensahe mula sa mga forum. Ang ganitong impormasyon ay maaaring iharap sa bisita ng pahina, halimbawa, sa pamamagitan ng isang form, bilang tugon sa isang kahilingan, o maaari itong mabuo nang pabago-bago sa bawat oras. Ngunit ang kahirapan ay madalas na ang naturang impormasyon ay hindi gaanong kailangan ng end user - isang tao, ngunit ng iba pang mga system at program na gagamit ng data na ito para sa kanilang mga kalkulasyon o iba pang mga pangangailangan.

Tunay na halimbawa: isang pahina ng isang website ng pagbabangko na nagpapakita ng mga quote ng pera. Kung na-access mo ang pahina bilang isang regular na user, sa pamamagitan ng isang browser, makikita mo ang lahat ng disenyo ng pahina, mga banner, mga menu at iba pang impormasyon na "nagbabalangkas" sa tunay na layunin ng paghahanap - mga quote ng pera. Kung kailangan mong ilagay ang mga quote na ito sa iyong online na tindahan, wala nang ibang gagawin kundi manu-manong piliin ang kinakailangang data at ilipat ito sa iyong website sa pamamagitan ng clipboard. At kailangan mong gawin ito araw-araw. Wala na ba talagang daan palabas?

Kung malulutas mo ang problema nang direkta, pagkatapos ay isang solusyon kaagad ang lilitaw: ang isang programa (script sa isang website) na nangangailangan ng data ay tumatanggap ng isang pahina mula sa server bilang isang "regular na gumagamit", nag-parse (nag-parse) ng nagresultang html code at nag-extract ng kinakailangang impormasyon mula rito. Magagawa ito alinman sa isang regular na regular na expression, o gamit ang anumang html parser. Ang kahirapan ng diskarte ay nakasalalay sa hindi pagiging epektibo nito. Una, upang makatanggap ng isang maliit na bahagi ng data (ang data sa mga pera ay literal na isang dosenang o dalawang character), kailangan mong matanggap ang buong pahina, na hindi bababa sa ilang sampu-sampung kilobytes. Pangalawa, sa anumang pagbabago sa code ng pahina, halimbawa, ang disenyo ay nagbago o iba pa, ang aming parsing algorithm ay kailangang muling gawin. At ito ay kukuha ng isang patas na halaga ng mga mapagkukunan.

Samakatuwid, ang mga developer ay dumating sa isang desisyon - ito ay kinakailangan upang bumuo ng isang uri ng unibersal na mekanismo na magpapahintulot sa transparent (sa protocol at transmission medium level) at madaling pagpapalitan ng data sa pagitan ng mga programa na maaaring matatagpuan kahit saan, na nakasulat sa anumang wika at tumatakbo sa ilalim ng anumang operating system at sa anumang platform ng hardware. Ang ganitong mekanismo ay tinatawag na ngayong malakas na terminong "Mga serbisyo sa web", "SOAP", "arkitekturang nakatuon sa serbisyo". Para sa palitan ng data, ginagamit ang mga bukas at sinubok sa oras na mga pamantayan - ang HTTP protocol ay ginagamit upang magpadala ng mga mensahe (bagaman ang iba pang mga protocol ay maaaring gamitin - SMTP, halimbawa). Ang data mismo (sa aming halimbawa, mga halaga ng palitan) ay ipinadala na nakabalot sa isang cross-platform na format - sa anyo ng mga XML na dokumento. Para sa layuning ito, isang espesyal na pamantayan ang naimbento - SOAP.

Oo, ngayon ang mga serbisyo sa web, SOAP at XML ay nasa mga labi ng lahat, nagsisimula na silang aktibong ipatupad, at ang malalaking korporasyon tulad ng IBM at Microsoft ay naglalabas ng mga bagong produkto na idinisenyo upang tulungan ang kabuuang pagpapatupad ng mga serbisyo sa web.

Ngunit! Para sa aming halimbawa sa mga halaga ng palitan na dapat ipadala mula sa website ng bangko patungo sa makina ng online na tindahan, ang gayong solusyon ay magiging napakahirap. Pagkatapos ng lahat, ang paglalarawan ng pamantayan ng SOAP lamang ay tumatagal ng isang malaswang isa at kalahating libong pahina, at hindi lang iyon. Para sa praktikal na paggamit, kakailanganin mo ring matutunan kung paano magtrabaho sa mga third-party na aklatan at mga extension (nagsisimula lamang sa PHP 5.0 na may kasama itong library para sa pagtatrabaho sa SOAP), at magsulat ng daan-daan at libu-libong linya ng iyong sariling code. At ang lahat ng ito upang makakuha ng ilang mga titik at numero ay halatang napakahirap at hindi makatwiran.

Samakatuwid, mayroong isa pa, maaaring sabihin ng isa, alternatibong pamantayan para sa pagpapalitan ng impormasyon - XML-RPC. Ito ay binuo na may partisipasyon ng Microsoft ng UserLand Software Inc at idinisenyo para sa pinag-isang paglipat ng data sa pagitan ng mga application sa Internet. Maaari nitong palitan ang SOAP kapag gumagawa ng mga simpleng serbisyo kung saan hindi kailangan ang lahat ng kakayahan ng "enterprise" ng mga tunay na serbisyo sa web.

Ano ang ibig sabihin ng abbreviation XML-RPC? Ang RPC ay nangangahulugang Remote Procedure Call. Nangangahulugan ito na ang isang application (kung isang script sa server o isang regular na application sa computer ng kliyente) ay maaaring malinaw na gumamit ng isang paraan na pisikal na ipinapatupad at isinasagawa sa isa pang computer. Ginagamit dito ang XML upang magbigay ng unibersal na format para sa paglalarawan ng ipinadalang data. Bilang isang transportasyon, ang HTTP protocol ay ginagamit upang magpadala ng mga mensahe, na nagbibigay-daan sa iyo upang walang putol na makipagpalitan ng data sa pamamagitan ng anumang mga aparato sa network - mga router, firewall, proxy server.

At kaya, para magamit kailangan mong magkaroon ng: isang XML-RPC server na nagbibigay ng isa o higit pang mga pamamaraan, isang XML-RPC client na maaaring makabuo ng tamang kahilingan at magproseso ng tugon ng server, at alam din ang mga parameter ng server na kinakailangan para sa matagumpay na operasyon - address, pangalan ng pamamaraan at mga naipasa na parameter.

Ang lahat ng trabaho sa XML-RPC ay nangyayari sa mode na "request-response", ito ay isa sa mga pagkakaiba sa pagitan ng teknolohiya at ang SOAP standard, kung saan mayroong parehong mga konsepto ng mga transaksyon at ang kakayahang gumawa ng mga naantalang tawag (kapag ang server ay nag-imbak ang kahilingan at tumugon dito sa isang tiyak na oras sa hinaharap). Ang mga karagdagang feature na ito ay mas kapaki-pakinabang para sa makapangyarihang mga serbisyo ng korporasyon;

Ang pamamaraan para sa pagtatrabaho sa XML-RPC ay nagsisimula sa pagbuo ng isang kahilingan. Mukhang ganito ang karaniwang kahilingan:

POST /RPC2 HTTP/1.0
User-Agent: eshop-test/1.1.1 (FreeBSD)
Host: server.localnet.com
Uri ng Nilalaman: text/xml
Haba ng nilalaman: 172



Paraan ng Pagsubok
Kamusta XML-RPC!


Ang mga unang linya ay bumubuo sa karaniwang header ng kahilingan sa HTTP POST. Kasama sa mga kinakailangang parameter ang host, uri ng data (uri ng MIME), na dapat ay text/xml, at haba ng mensahe. Tinutukoy din ng pamantayan na ang field ng User-Agent ay dapat punan, ngunit maaaring maglaman ng isang arbitrary na halaga.

Susunod ay ang karaniwang header ng XML na dokumento. Ang ugat na elemento ng kahilingan ay , maaaring magkaroon lamang ng isa, at hindi maaaring maglaman ng mga naturang node bilang mga bata. Nangangahulugan ito na ang isang kahilingan ay maaari lamang tumawag sa isang paraan sa server.

Linya Paraan ng Pagsubok ay nagpapahiwatig na tinatawagan namin ang isang paraan na pinangalanang TestMetod. Kung kinakailangan, dito maaari mong tukuyin ang pangalan ng programa o module na naglalaman ng pamamaraan, pati na rin ang landas patungo dito. Ang detalye ng XML-RPC, bagama't nagpapataw ito ng ilang mga paghihigpit sa hanay ng mga character na maaaring magamit upang tukuyin ang isang pamamaraan, kung paano bigyang-kahulugan ang mga ito ay ganap na nakasalalay sa pagpapatupad ng server.

Susunod, itinakda ang ipinadalang mga parameter. Ginagamit ang seksyong ito para dito. Na maaaring maglaman ng arbitrary na bilang ng mga subelement Na naglalaman ng parameter na inilarawan ng tag . Titingnan natin ang mga parameter at uri ng data nang kaunti pa. Sa aming bersyon, ipinapasa ang paraan ng isang parameter ng string na nakapaloob sa tag .

Ang paglalarawan ng lahat ng mga parameter ay sinusundan ng pagsasara ng mga tag. Ang kahilingan at tugon sa XML-RPC ay mga regular na XML na dokumento, kaya dapat na sarado ang lahat ng mga tag. Ngunit walang iisang tag sa XML-RPC, bagama't naroroon ang mga ito sa pamantayang XML.

Ngayon tingnan natin ang tugon ng server. Normal ang header ng tugon ng HTTP; kung matagumpay na naproseso ang kahilingan, magbabalik ang server ng tugon na HTTP/1.1 200 OK. Tulad ng sa kahilingan, dapat mong tukuyin nang tama ang uri ng MIME, haba ng mensahe at petsa ng pagbuo ng tugon.

Ang katawan ng tugon mismo ay ang mga sumusunod:



totoo


Ngayon sa halip na ang root tag ipinahiwatig ang tag , na agad na naglalaman ng mga resulta ng pagproseso ng kahilingan. Sa kasamaang palad, ang tugon ay hindi pumasa sa pangalan ng pamamaraan, kaya dapat mong iimbak ito sa panig ng kliyente upang maiwasan ang pagkalito kung ang iba't ibang mga pamamaraan ay tinatawag nang sabay.

Kung may naganap na error habang pinoproseso ang iyong kahilingan, sa halip na Ang tugon ay maglalaman ng elemento , kung saan ilalagay ang isang istraktura na naglalarawan sa error. Ang paglalarawan ng error ay naglalaman ng isang numerong code ng error at isang paglalarawan ng teksto.

Ngayon tingnan natin ang mga uri ng data sa XML-RPC. Mayroong 9 na uri ng data sa kabuuan - pitong simpleng uri at 2 kumplikado. Ang bawat uri ay inilalarawan ng sarili nitong tag o hanay ng mga tag (para sa mga kumplikadong uri).

Mga simpleng uri:

Buong mga numero- tag o ;

Uri ng Boolean- tag , maaaring tumagal ng parehong mga halaga 0/1 at true/false;

ASCII string- inilarawan sa pamamagitan ng tag at maaaring maglaman ng arbitrary na string ng mga character;

Mga numero ng floating point- tag , ay maaari ding maglaman ng tanda ng numero, ang bahaging praksyonal ay pinaghihiwalay ng isang tuldok;

petsa at oras- inilarawan sa pamamagitan ng tag at dapat sumunod sa format na iso8601. Medyo hindi maginhawa ang format na ito para sa karagdagang pagproseso sa mga script, kaya palagi itong kino-convert kapag nagpapadala/nakatanggap ng kahilingan. Magagawa ito ng isang espesyal na function sa loob ng library, o, kung wala, dapat na manu-manong i-convert ng developer ang petsa.

Ang huling simpleng uri ay base64 na naka-encode na string, na inilalarawan ng tag . Ang uri na ito ay unibersal; maaari itong magamit upang maglipat ng anumang data sa pagitan ng kliyente at ng server, kahit na ang dami ng inilipat na data ay tumataas dahil sa naturang pag-encode. Ngunit ito ay isang kinahinatnan ng textual na katangian ng protocol at ang XML format sa partikular.

Ang mga kumplikadong uri ay kinakatawan ng mga istruktura at array. Ang istraktura ay tinutukoy ng elemento ng ugat , na maaaring maglaman ng arbitrary na bilang ng mga elemento , na tumutukoy sa bawat miyembro ng istraktura. Ang isang miyembro ng istraktura ay inilalarawan ng dalawang tag: una, , inilalarawan ang pangalan ng miyembro, pangalawa, , naglalaman ng halaga ng miyembro (kasama ang isang tag na naglalarawan sa uri ng data).

Ang mga array ay walang mga pangalan at inilalarawan ng tag na naglalaman ng isang elemento , at isa o higit pang elemento ng bata , kung saan tinukoy ang partikular na data. Ang isang array ay maaaring maglaman ng anumang iba pang mga uri sa anumang pagkakasunud-sunod, pati na rin ang iba pang mga array, na nagbibigay-daan sa iyong ilarawan ang mga multidimensional na array. Maaari mo ring ilarawan ang isang hanay ng mga istruktura. Ngunit ang katotohanan na ang array ay walang pangalan ay nagpapalubha sa paggamit nito sa ilang mga kaso upang maglipat ng kumplikadong data, kailangan nilang paulit-ulit na i-pack sa iba pang mga uri (halimbawa, upang ilipat ang ilang mga array, maaari mong i-pack ang bawat array nang hiwalay sa isang istraktura; , at pagkatapos ay lumikha ng isang array mula sa mga istrukturang ito).

Siyempre, may magsasabi na ang naturang listahan ng mga uri ng data ay napakahirap at "hindi ka pinapayagang palawakin." Oo, kung kailangan mong maglipat ng mga kumplikadong bagay o malalaking halaga ng data, mas mahusay na gumamit ng SOAP. At para sa mga maliliit, hindi hinihingi na mga aplikasyon, ang XML-RPC ay lubos na angkop bukod dito, napakadalas kahit na ang mga kakayahan nito ay lumalabas na napakarami! Isinasaalang-alang ang kadalian ng pag-deploy, isang napakalaking bilang ng mga aklatan para sa halos anumang wika at platform, at malawak na suporta sa PHP, kung gayon ang XML-RPC ay kadalasang walang mga kakumpitensya. Bagaman hindi ito maaaring agad na irekomenda bilang isang unibersal na solusyon - sa bawat partikular na kaso dapat itong magpasya ayon sa mga pangyayari.

  • Suporta para sa paglikha ng parehong mga kliyente at server ng xmlrpc
  • Ganap na awtomatiko o ganap na manu-mano, pinong pag-encode at pag-decode mula sa mga halaga ng php hanggang sa xmlrpc
  • Suporta para sa UTF8, Latin-1 at ASCII character encodings. Kapag pinagana ang php mbstring extension, mas maraming character set ang sinusuportahan.
  • Suporta para sa http compression ng parehong mga kahilingan at tugon, cookies, proxy, basic auth at https, ntlm auth at keepalives gamit ang php cURL extension
  • Opsyonal na pagpapatunay ng mga uri ng parameter ng papasok na kahilingan sa xmlrpc
  • Suporta para sa system.listMethods, system.methodHelp, system.multicall at system.getCapabilities na pamamaraan
  • Suporta para sa at mga extension sa xmlrpc
  • Posibilidad na irehistro ang umiiral na function ng php o mga pamamaraan ng klase bilang mga serbisyo sa web, pagkuha ng impormasyong idinagdag na halaga mula sa mga komento ng phpdoc
  • Ang isang web based na visual debugger ay kasama sa library

Mga kinakailangan

  • PHP 5.3.0 o mas bago; Inirerekomenda ang 5.5 o mas bago
  • kailangan ang php "curl" extension kung gusto mong gumamit ng SSL o HTTP 1.1 para makipag-ugnayan sa mga malalayong server
  • ang php "mbstring" extension ay kailangan upang payagan ang pagtanggap ng mga kahilingan/tugon sa mga set ng character maliban sa ASCII, Latin-1, UTF-8
  • ang php "xmlrpc" native extension ay hindi kinakailangan, ngunit kung ito ay naka-install, walang magiging interference sa pagpapatakbo ng library na ito.

I-download

Balita

  • ika-1 ng Hulyo, 2017
    Inilabas ang mga bersyon ng lib na 4.2.0 at 3.1.0.
    Ang mga tala sa paglabas ay magagamit sa Github
  • ika-20 ng Enero, 2016
    Inilabas ang bersyon ng lib na 4.0.0.
    Ito ang unang pagkakataon - kailanman - na ang API ay nakakakita ng malalaking pagbabago, inaalis ang nakaraan at nagsisimula ng paglipat sa modernong-panahong php.
    Ang mga namespace ay ipinakilala, at ang default na character set ay ginagamit kung UTF-8; naidagdag na ang suporta para sa mbstring, at marami pang iba.
    Para sa kumpletong listahan ng mga pagbabago, pumunta sa Github
  • ika-19 ng Abril, 2015
    Inilabas ang bersyon ng lib na 3.0.1.
  • ika-15 ng Hunyo, 2014
    Inilabas ang bersyon ng lib na 3.0.0.
  • ika-15 ng Disyembre, 2013
    Inilipat ang proyekto sa GitHub

    Online na xmlrpc debugger

    Ang isang demo xmlrpc debugger application, na binuo sa ibabaw ng library na ito, ay aktibo sa address na http://gggeek.altervista.org/sw/xmlrpc/debugger/ . Maaari mong gamitin ang debugger upang hal. i-query ang SF demo server, o i-debug ang iyong sariling personal na xmlrpc server, kung ito ay naa-access sa net.

    Pag-unlad

    PaglalarawanKatayuan - na-update noong 2009/07/26
    I-update ang dokumentasyon para sa lahat ng feature na idinagdag mula noong bersyon 2Unti-unting umuunlad...
    Idagdag ang posibilidad na pumili ng pag-format ng mga xml na mensaheKatulad ng ginagawa ng php native xmlrpc extension
    Ayusin ang mga babalang ilalabas kapag tumatakbo gamit ang PHP 5 sa STRICT modeMaaaring nagawa na sa bersyon 3.0, inabanduna ang php 4 compat...
    I-expand ang awtomatikong php function sa xmlrpc method wrapper para samantalahin ang exception handling at ibalik ang xmlrpc error responses
    Palawakin ang awtomatikong stub generator para sa awtomatikong pag-convert ng mga function ng php sa mga pamamaraan ng xmlrpc para sa PHP<= 5.0.2 tingnan ang AMFPHP code kung paano ito gagawin.
    Maraming mga pagpapahusay sa bersyon 2.1
    Ngayon na ang server ay maaaring awtomatikong magrehistro ng mga pag-andar ng php mayroong mas kaunting pangangailangan para dito...
    Mas mahusay na suporta para sa mbstring kapag naka-enable itoDapat gumawa e.g. charset encoding paghula mas mabilis
    Pagbutihin ang suporta para sa "bersyon 1" na cookies
    Magdagdag ng posibilidad na gamitin sa halip na ang mga native na error code
    PEAR compatibility: magdagdag ng mga kasingkahulugan para sa mga function na umiiral na may iba't ibang pangalan sa PEAR na bersyon ng lib
    Magdagdag ng suporta para sa xmlrpc extension
    Idagdag sa debugger ang kakayahang maglunsad ng kumpletong hanay ng mga pagsubok sa validator1
    Suriin ang kakayahang magamit ng WSDL para sa paglalarawan ng mga nakalantad na serbisyo at pagsasalin sa/mula sa system.methodSignature at system.describeMethodsMayroong ilang mga problema sa paggamit ng isang XSD upang mahigpit na tukuyin ang xmlrpc. Ang Relax NG ay talagang mas mahusay na alternatibo, ngunit may kaunting suporta sa iba pang mga toolkit para sa paggamit nito kasabay ng isang WSDL file...
    Suportahan ang mga pag-redirect ng http (302)
    Magdagdag sa sf.net ng isang maliit na database, upang maipatupad namin ang isang validator page na nagla-log ng mga papasok na user, tulad ng naroroon sa xmlrpc.com site
    Idagdag sa benchmark suite ang kakayahang mag-upload ng mga resulta sa sf.net
    Sumulat ng isang extension ng php na magpapabilis sa pinakamaraming ginagamit na function ng libTingnan kung paano ito ginawa ni adodb para sa isang halimbawa
    Test speed/memory gains gamit ang simplexml at relaxng sa halip na hand parsing ng xml

    Seguridad

    Ang ikatlong paglabag sa seguridad: Agosto 2005

    Ito ay isang karagdagang at maagap na tugon sa pangalawang paglabag sa seguridad sa ibaba. Ang lahat ng paggamit ng eval() ay tinanggal dahil ito ay isang potensyal na pagsasamantala.

    Noong orihinal na isinulat ang library, ang mga bersyon ng php na magagamit sa panahong iyon ay hindi kasama ang call_user_func(), et al. Kaya isinulat ito sa loob ng mga hadlang na iyon upang gamitin ang eval() sa dalawa sa mga function na tinatawag ng xml parser. Dahil sa paggamit na ito, gumamit din ang klase ng server ng eval() dahil kailangan nitong i-parse ang xml gamit ang parehong mga function.

    Ang mga function ng handler na ito, at ang array na ginamit upang mapanatili ang nilalaman ng orihinal na mensahe, ay muling isinulat upang bumuo ng mga halaga ng php sa halip na bumuo ng php code para sa pagsusuri. Dapat nitong alisin ang anumang potensyal para sa pagpapatupad ng code.

    Ang pangalawang paglabag sa seguridad: Hulyo 2005

    Ang kahinaan sa seguridad na natuklasan ni James Bercegay ng GulfTech Security Research noong ika-27 ng Hunyo, 2005, ay nagdulot ng matinding kaguluhan. Nakarating na ito sa front page ng Salshdot, nabanggit sa Netcraft, LWN at marami pang ibang site.

    Ang mga detalyadong tagubilin sa pagbuo ng exploit code ay inilabas sa internet, at maraming mga web hosting administrator ang naiwang nagtataka kung ano ang pinakamahusay na plano sa pagtatanggol, at ano ang mga tunay na panganib. Narito ang ilang mga sagot.

    Saklaw ng problema

    • nakakaapekto ang bug sa dalawang aklatan na kilala bilang PEAR::XMLRPC at PHPXMLRMPC.
      HINDI nito naaapektuhan ang pagpapatupad ng xmlrpc na naka-built-in sa php at pinagana sa oras ng pag-compile gamit ang opsyong "--with-xmlrpc" (sa Unix, sa mga bintana sa pangkalahatan ito ay pinagana/naka-disable sa pamamagitan ng pagbabago ng naaangkop na linya sa php.ini )
    • ang bug (execution ng php-code injected by remote hosts) ay namamalagi lamang sa file xmlrpc.inc sa phpxmlrpc distribution at RPC.php sa pamamahagi ng PEAR
    • parehong PEAR::XMLRPC at PHPXMLRMPC ay naglabas ng mga na-update na bersyon ng library na nag-aayos ng problema
    • ang parehong mga aklatan ay ginamit sa isang malaking bilang ng mga php application (tingnan ang hindi kumpletong listahan sa itaas).
      Dahil ang buong lib ay karaniwang binubuo ng 2 napakasimpleng file, lahat ay may posibilidad na i-patch ang mga ito ayon sa kanilang sariling panlasa/pangangailangan at i-bundle ang mga ito kapag namamahagi ng kanilang app.
      Karamihan sa mga high-profile na proyekto ay napakabilis sa paglalabas ng mga bagong bersyon ng kani-kanilang mga app, ngunit mas matagal ang panahon para sa bawat user na mag-update ng kanyang system.
      Kailangang sabihin na maraming mga aplikasyon ang naipadala hanggang kamakailan na may kasamang lubhang hindi napapanahong mga bersyon ng phpxmlrpc library; isang unang bug sa pag-iniksyon ay naayos noong 2001 nang walang sinumang tila nakakapansin (...)

      Sa kasamaang-palad, mas mahirap para sa mga sysadmin na makahanap ng madaling lunas para sa problema: may malaking pagkakataon na sa mga pampublikong hosting server ang mga nabanggit na file ay makikita sa maraming iba't ibang mga direktoryo at sa maraming iba't ibang mga bersyon.

    Paano na-trigger ang kahinaan

    • upang ma-trigger ang bug ang isang attacker ay kailangang magkaroon ng ilang espesyal na ginawang xml na sinusuri sa proseso ng paglikha ng isang xmlrpcval object. Ang mga bagay na Xmlrpcval ay nilikha kapag ang script ng server ay nagde-decode ng mga kahilingan ng xmlrpc o kapag ang ilang mga script ng php ay nagsisilbing isang xmlrpc client at nagde-decode ng tugon na ipinadala ng isang server.
      Ang script ng server ay partikular sa application, at madalas itong pinangalanang server.php (ngunit ang anumang variant ng proyekto o pinili ng user ay posible), at dapat itong isama ang parehong xmlrpc.inc at xmlrpcs.inc file (para sa pear na bersyon, server Ang .php ay katumbas ng xmlrpcs.inc).
    • Ang pagsasama lamang ng xmlrpc.inc at xmlrpcs.inc sa mga script ng php ay (afaik...) ganap na ligtas, pati na rin ang pagtawag sa kanila nang direkta sa pamamagitan ng mga kahilingan sa http, dahil ang kahulugan lamang ng mga function, variable at klase ay isinasagawa sa dalawang file na iyon, i.e. walang agarang code execution.
    • Ang server.php at discussion.php file na ipinamahagi nang buo ang phpxmlrpc lib ay talagang nagpapatupad ng isang live na xmlrpc server, kaya maaari mong isaalang-alang ang pag-block ng access sa mga ito o kahit na mas mahusay na alisin ang mga ito kung nakita mong naka-deploy ang mga ito sa mga server ng produksyon (sa tuktok ng aking isip, maaari akong mag-isip ng ilang uri ng pag-atake na kinasasangkutan ng pangalawang php app na dumaranas ng paglabag sa pag-takeover-php-file-inclusion para hilahin sila + pagsamantalahan ang kilalang bug sa lib)

    Paraan ng proteksyon

    • Bigyan ang proseso ng iyong web server ng kaunting mga pribilehiyo ng system hangga't maaari. Sa Unix, sa pangkalahatan ay kinabibilangan ito ng pagpapatakbo ng Apache bilang user nobody at/o sa isang naka-jailrooted/chrooted na kapaligiran. Dahil ang PHP engine ay tumatakbo sa ilalim ng parehong user bilang web server, ito ang unang linya ng depensa: anumang php code na na-inject ng isang attacker ay tatakbo sa server bilang isang user na hindi gaanong may pribilehiyo, at ang lahat ng pinsalang magagawa nito ay limitado sa nakakagambala sa php application mismo
    • Patakbuhin ang php sa safe mode. Kung ikaw ay isang pampublikong host at hindi ginagawa ito, malamang na ang iyong server ay na-root pa rin. Pinipigilan nito ang mga script ng php na gumamit ng anumang function na sa tingin mo ay hindi ligtas, tulad ng system() o eval()
    • Ang mahirap na block: hanapin ang lahat ng umiiral na phpxmlrpc file (xmlrpc.inc at xmlrpcs.inc) at huwag paganahin ang mga ito (chmod 0) sa buong system.
      Siyempre, maaaring pigilan nito ang ilang application ng user na gumana kaya dapat mong ipaalam sa iyong mga user sa oras na gawin mo ito.
    • Ang malambot na bloke: palitan ang lahat ng kopya ng mga umiiral nang phpxmlrpc file (xmlrpc.inc at xmlrpcs.inc) ng mga nagmumula sa bersyon 1.1.1.
      Ang paraang ito sa kasamaang-palad ay hindi 100% na garantisadong panatilihing gumagana ang lahat ng app. Ang ilang mga panloob ng lib object ay nagbago mula sa bersyon 0.9 hanggang 1.0 hanggang 1.1 (hal. ang representasyon ng mga header ng http na naka-imbak sa loob ng isang xmlrpcresp object), at kung ang code na iyong na-deploy sa iyong mga server ay nag-subclass sa kanila, maaari itong magkaroon ng problema. Ang xml na ipinadala ng over-the-wire ay nagbago rin patungkol sa ilang mas lumang bersyon ng lib (sa partikular: bersyon 1.0.99.2 na maling naka-encode na mga character sa labas ng hanay ng ASCII bilang mga html entity, samantalang ang mga ito ay naka-encode bilang xml charset entity). Ang ilang bagong error response code ay naidagdag din. Sa pagsasabing iyon, dapat ay 95% kang ligtas na patakbuhin ang script na iyon at umupo doon habang naghihintay para sa mga user na magsimulang sumigaw na may sira...
    • ang PHP PEAR library ay maa-upgrade sa isang one-line na command, kaya hindi iyon isang malaking problema:
      pear upgrade XML_RPC at upang malaman kung ito ay na-upgrade (1.3.1 o mas bago ay OK, ang pinakabago sa ngayon ay 1.3.2):
      listahan ng peras | grep RPC

    Ang ilang mga karagdagang pagsasaalang-alang

    Ang file na xmlrpcs.inc ay na-patch din sa release 1.1.1 upang magbigay ng mas magandang karanasan ng user. Sa higit pang detalye: ang pagpapadala ng espesyal na ginawang malformed xml sa isang server ay magdudulot ng php script na maglabas ng php error sa halip na magbalik ng naaangkop na xml na tugon.
    Ayon sa ilan, ito ay aktwal na nangangailangan ng isang "path disclosure security breach" (i.e. ang php error message na ipinapakita ay karaniwang naglalaman ng sensitibong impormasyon tungkol sa mga path ng filesystem), ngunit pagkatapos ay anumang solong PHP script ay dumaranas ng parehong problema sa seguridad kung ang sysadmin ay nagpapatakbo ng mga production server na may ang ini directive display_errors=On.
    Alam ko rin sa katotohanan na maraming lugar sa xmlrpc.inc kung saan ang pagtawag sa isang function na may hindi inaasahang parameter ay bubuo ng babala o error sa php, at hindi ko pinaplano na magpatupad ng mahigpit na pagsusuri ng parameter para sa bawat solong function anumang oras sa lalong madaling panahon - kung ikaw layunin para sa na, imho, maaari mo ring code sa java sa unang lugar.

    Ito na ba ang katapusan ng mundo?

    Sana hindi.
    Ang dahilan ay mayroong sampu-sampung mga aplikasyon ng PHP doon na nagdurusa sa mga pagsasamantala sa iniksyon ng code. Tingnan lamang ang panseguridad na track ng mga bulletin board... ngunit marami pa rin ang nag-iisip na ang PHP ay isang magandang pagpipilian para sa web development.
    Tandaan: ang seguridad ay isang proseso, hindi isang estado na maaaring maabot.

    Ang unang paglabag sa seguridad: Setyembre 2001

    Natanggap ko ang advisory na ito mula kay Dan Libby. Sa kanyang pahintulot ito ay muling ginawa dito. Tandaan na ang pagsasamantalang ito ay naayos sa mga pagbabagong 1.01 at mas mataas ng XML-RPC para sa PHP. -- Edd Dumbill Tue Set 24 2001 ============ PHP Security Hole: potensyal na pagsasamantala ng XML-RPC ================== == ======================== Abstract: Gamit ang pinakabagong release ng Useful Inc's php xmlrpc library, bersyon 1.0, posible para sa isang attacker na bumuo ang xml sa paraang linlangin ang xml-rpc library sa pag-execute ng php code sa isang web server, nagawa kong isagawa ang arbitrary na php code, at nang naka-off ang php's safe-mode, ang mga command ng system. Madaling magagamit ito ng isang umaatake bilang gateway para sa paglulunsad ng mga virus. Mga Detalye: Ipinakita ko ang problema sa pamamagitan ng pagbabago sa halimbawa ng script ng server.php na kasama sa distribusyon ng xmlrpc at pagkatapos ay tinawag ito sa pamamagitan ng script ng client.php, bahagi rin ng pamamahagi. Nilampasan ko ang karaniwang code ng server, at nag-echo"d lang ng mga tugon pabalik sa kliyente. Nakuha ko ang kliyente na magsagawa ng arbitrary na php code. Ibinalik ko ang sample ng server.php sa orihinal nitong estado at ginamit ang telnet para magpadala ng binagong request. Nagawa ko ring i-execute ang code sa server, kahit na nangangailangan ng bahagyang naiibang syntax. Dahil alam ko na ang xml-rpc library ay gumagamit ng eval upang bumuo ng mga istruktura ng data nito mula sa xml input, ito ay isang bagay lamang ng pagbubuo ng input xml sa paraang ito: a) ay hindi nakatakas bago ipasa sa eval b) ginagawa hindi makabuo ng php syntax error Karaniwan, lahat ng hindi numeric na data ay tinatakasan ng library bago ipasa sa eval. Gayunpaman, lumalabas na kung magpadala ka ng isang tag, na sinusundan ng hindi inaasahang tag, gaya ng , ang escaping code ay malalampasan at ang "raw" na data ay susuriin sa halip. Pagsasamantala sa kliyente: Narito ang isang karaniwang tugon ng xml-rpc: kumusta mundo Kapag ang naturang tugon ay eval"ed, mukhang: bagong xmlrpcval("hello world", "string") Narito ang isang xml-rpc na tugon na magpapatupad ng php code sa echo "

    kumusta mundo

    " sa panig ng kliyente: "," string"); echo "

    kumusta mundo

    "; \$waste = array("
    Sa kasong ito, ang string na eval"ed ay: new xmlrpcval("", "string"); echo "

    kumusta mundo

    "; $waste = array("", "string") Posibleng palitan ang lahat sa pagitan ng "string"); at \$waste na may arbitrary code na halos anumang haba. Panghuli, narito ang isa na magpi-print ng mga nilalaman ng kasalukuyang direktoryo: "," string"); echo "

    "; echo `ls -al`; echo "

    "; lumabas; \$waste = array("
    Pagsasamantala sa server: Ang pagsasamantala ng server ay halos kapareho ng kliyente, maliban na ang server ay gumagamit ng ibang eval na utos, at sa gayon ay nangangailangan ito ng bahagyang naiibang simula at pagtatapos ng syntax upang maiwasan ang mga php syntax error. Narito ang parehong code tulad ng nasa itaas, ngunit gagana ito laban sa isang server. system.listMethods ", "string")); echo "

    kung makakita ka ng isang listahan ng direktoryo, pinaandar ko lang ang php at system code sa pamamagitan ng xml-rpc.

    "; echo "ngayon ay susubukan ko ang isang listahan ng direktoryo gamit ang ls -al:\n "; echo `ls -al`; echo ""; echo "Madali lang sana akong nag-invoke ng rm -rf, o nagsulat ng program sa disk at pinaandar ito (hal., isang virus) o nagbasa ng ilang file. Magandang araw.

    "; lumabas; $waste = array(array("
    Lugar ng Problema: sa xmlrpc.inc, mayroong isang function na tinatawag na xmlrpc_cd(), na tinatawag ng xml parser upang pangasiwaan ang data ng character. function xmlrpc_cd($parser, $data) ( global $_xh, $xmlrpc_backslash, $xmlrpc_twoslash; //if (ereg("^[\n\r \t]+$", $data)) bumalik; // print " pagdaragdag ng [$(data)]\n"; if ($_xh[$parser]["lv"]==1) ($_xh[$parser]["qt"]=1; $_xh[$parser][ "lv"]=2; ) if ($_xh[$parser]["qt"]) ( // sinipi ang string $_xh[$parser]["ac"].=str_replace("\$", "\\ $", str_replace(""", "\"", str_replace(chr(92),$xmlrpc_backslash, $data))); ) else $_xh[$parser]["ac"].=$data; ) Ito ay ang huling iba pa na nagiging sanhi ng pagdaragdag ng data nang hindi nakakatakas. Napaka delikado magkaroon ng ganito. Ito pa ay tila inilaan para sa numeric na data, at napakahirap na itinakda at i-unset ang variable na "qt" (quote) na nagiging on at off ang pagtakas. Gayunpaman, hindi agad malinaw sa akin kung bakit hindi dapat i-escape nang katulad ang numeric data, at ang if/ else inalis, na walang pagkakataon para sa ganitong uri ng pagsasamantala.