13.07.2015 Views

этом - Xakep Online

этом - Xakep Online

этом - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

64 ÎØÈÁÊÈ ÌÎËÎÄÎÑÒÈ ÑÏÅÖ 02-07— PEERADDR (ÑÈÍÎÍÈÌ PEERHOST)ÀÄÐÅÑ ÓÄÀËÅÍÍÎÃÎ ÑÅÐÂÅÐÀ  ÂÈÄÅÑÒÐÎÊÈ 'XX.XX.XX.XX' ÈËÈ ÈÌÅ-ÍÈ ÑÅÐÂÅÐÀ;— PEERPORT — Î×ÅÂÈÄÍÎ, ÏÎÐÒÍÀÇÍÀ×ÅÍÈß;— PROTO — ÏÐÎÒÎÊÎË, ÏÎ ÊÎÒÎÐÎÌÓÏËÀÍÈÐÓÅÒÑß ÓÑÒÀÍÎÂÈÒÜ ÑÎÅÄÈÍÅ-ÍÈÅ ('TCP, 'UDP' È ÒÀÊ ÄÀËÅÅ);— TYPE — ÒÈÏ ÑÎÊÅÒÀ.  ÍÀØÅÌ ÑËÓ×ÀÅSOCK_STREAM (ÏÎÒÎÊÎÂÛÉ ÑÎÊÅÒ,ÃÀÐÀÍÒÈÐÓÅÒÑß ÄÎÑÒÀÂÊÀ ÄÀÍÍÛÕ —ÐÅÆÈÌ ÂÈÐÒÓÀËÜÍÛÕ ÑÎÅÄÈÍÅÍÈÉ),ÒÀÊÆÅ ÂÎÇÌÎÆÍÛ ÇÍÀ×ÅÍÈßSOCK_RAW (ÑÈÌÂÎËÜÍÛÉ, ÍÅÑÒÐÓÊÒÓ-ÐÈÐÎÂÀÍÍÛÉ ÑÎÊÅÒ) È SOCK_DGRAM(ÐÅÆÈÌ ÏÅÐÅÑÛËÊÈ ÄÀÉÒÀÃÐÀÌÌ).Comprehensive Perl Archive Networkèâàåòñÿ â çàãîëîâîê, èäåíòèôèöèðóÿ áðàóçåð. Äàëååìû ôîðìèðóåì îáúåêò êëàññà HTTP::Requestè ïåðåäàåì åãî â êà÷åñòâå ïàðàìåòðà â ìåòîärequest, ïîñëå ÷åãî îáðàáàòûâàåì ïîëó÷åííûé ðåçóëüòàò.Ìåòîä is_success (ñóùåñòâóåò òàêæå îáðàòíûéìåòîä is_error) ïðîâåðÿåò êîä îòâåòà ñåðâåðàè âîçâðàùàåò 1 â ñëó÷àå óñïåõà. Äóìàþ, ñêðèïòäîñòàòî÷íî ïðîñò è íå òðåáóåò äîïîëíèòåëüíûõêîììåíòàðèåâ.Íåñìîòðÿ íà òî, ÷òî âåñü îñíîâíîé ôóíêöèîíàëðåàëèçîâàí â ðàìêàõ îáúåêòíî-îðèåíòèðîâàííîéêîíöåïöèè, åñòü âîçìîæíîñòü èñïîëüçîâàòü èêðàòêèé ïðîöåäóðíûé èíòåðôåéñ, êîòîðîãî ìîæåòõâàòèòü â áîëüøèíñòâå ñëó÷àåâ. Ðåàëèçîâàíà ýòàâîçìîæíîñòü â âèäå ìîäóëÿ LWP::Simple, â êîòîðîìäîñòóïíû ñëåäóþùèå ìåòîäû:— GET($URL) — ÏÎËÓ×ÀÅÒ ÄÎÊÓÌÅÍÒ, ÓÊÀ-ÇÀÍÍÛÉ Â $URL, ÃÄÅ $URL — ÑÒÐÎÊÀ;— HEAD($URL) — ÏÎËÓ×ÀÅÒ ÏÀÐÀÌÅÒÐÛÇÀÃÎËÎÂÊÀ ÎÒÂÅÒÀ;— GETPRINT($URL) — ÏÎËÓ×ÀÅÒ È ÐÀÑÏÅ-×ÀÒÛÂÀÅÒ ÎÒÂÅÒ, ÂÎÇÂÐÀÙÀÅÒ ÊÎÄÎÒÂÅÒÀ ÑÅÐÂÅÐÀ;— GETSTORE($URL, $FILE) — ÏÎËÓ×ÀÅÒÈ ÑÎÕÐÀÍßÅÒ ÎÒÂÅÒ Â $FILE, ÂÎÇÂÐÀ-ÙÀÅÒ ÊÎÄ ÎÒÂÅÒÀ ÑÅÐÂÅÐÀ.Âîîáùå, áèáëèîòåêà ýòà äîñòàòî÷íî ìîùíàÿ è ìîæåòáûòü èñïîëüçîâàíà äàæå äëÿ íàïèñàíèÿ ñâîåãîìàëåíüêîãî HTTP-ñåðâåðà. Äëÿ ïîäðîáíîãî ðàññêàçàîáî âñåõ âîçìîæíîñòÿõ LWP ïîòðåáîâàëñÿ áûîáúåì âñåãî æóðíàëà. Íàïðèìåð, ñ ïîìîùüþ LWPìîæíî ðàáîòàòü ÷åðåç Proxy, è ìíîãî ÷åãî åùå ïîëåçíîãîäåëàòü. Îäíàêî èäåì äàëüøå.íèçêîóðîâíåâàÿ ðàáîòà ñ ïðîòîêîëàìè. Åñëè âïðîöåññå íàïèñàíèÿ ýêñïëîéòà âîçíèêàåò íåîáõîäèìîñòüñïóñòèòüñÿ ñ ïðèêëàäíîãî óðîâíÿ íèæå ïî ñòåêóïðîòîêîëîâ, òî è òóò Perl ïðåäîñòàâèò íàì äîñòàòî÷íûéíàáîð èíñòðóìåíòîâ. Äëÿ íà÷àëà ðàññìîòðèì, êàêæå îðãàíèçîâàòü êëèåíò-ñåðâåðíîå ñîåäèíåíèå ïîäPerl. Äëÿ ðåøåíèÿ ýòîé çàäà÷è â ñòàíäàðòíóþ ïîñòàâêóPerl âêëþ÷åí ïàêåò IO::Socket, êîòîðûé è îáåñïå÷èâàåòáàçîâóþ ôóíêöèîíàëüíîñòü ñîêåòîâ. Ýòîò êëàññèìååò ìíîæåñòâî ïîäêëàññîâ, êîòîðûå íàñëåäóþò âñååãî ìåòîäû è îáåñïå÷èâàþò áîëåå êîíêðåòíóþ ôóíêöèîíàëüíîñòü(íàïðèìåð, IO::Socket::INET äëÿ ðàáîòûñ TCP- è UDP-ñîêåòàìè, IO::Socket::SSL äëÿ ðàáîòû ñçàùèùåííûì ñîåäèíåíèåì è òàê äàëåå). Ïîìèìî ýòîãîêëàññà, â Perl ñóùåñòâóåò áàçîâûé ìîäóëü Socket,êîòîðûé ïðîñòî ðåàëèçóåò ôóíêöèîíàë ñòàíäàðòíîéC-áèáëèîòåêè Socket.h è ÿâëÿåòñÿ ìîäóëåì áîëåå íèçêîãîóðîâíÿ, ÷åì IO::Socket.×òîáû ñîçäàòü TCP-êëèåíò, êîòîðûé áû ñîåäèíÿëñÿñ êàêèì-ëèáî ñåðâåðîì, ñ ïîìîùüþ IO::Socket::INET,äîñòàòî÷íî ñëåäóþùåãî ïðîñòîãî êîäà:use IO::Socket::INET;my $socket = IO::Socket::INET->new(PeerAddr->$remote_host,PeerPort->$remote_port, Proto->«tcp», Type->SOCK_STREAM)or die «Can't open connectionwith $remote_host:$remote_port: $!\n»;print $socket 'Save the planet — killyourself!';$answer = ;close($socket); ïåðâîé ñòðî÷êå ìû ïîäêëþ÷àåì íóæíóþ áèáëèîòåêó.Âî âòîðîé ñòðîêå ìû âûçûâàåì êîíñòðóêòîð êëàññàIO::Socket::INET ñî ñëåäóþùèìè ïàðàìåòðàìè:Ïîñëå îòêðûòèÿ êëèåíòñêîãî ñîêåòà ìû ìîæåì ðàáîòàòüñ íèì, êàê ñ ôàéëîâûì äèñêðèïòîðîì,òî åñòü òàêæå ïèñàòü ñ ïîìîùüþ print è ÷èòàòü ñ ïîìîùüþîïåðàòîðà .Äëÿ îòêðûòèÿ ñîêåòà íà îæèäàíèå ñîåäèíåíèÿ(÷òî âðÿä ëè ïîòðåáóåòñÿ äëÿ íàïèñàíèÿýêñïëîéòà, íî íåîáõîäèìî äëÿ ïîëíîòû ïîíèìàíèÿ),äîñòàòî÷íî óêàçàòü ïàðàìåòðû Listen (ìàêñèìàëüíîåêîëè÷åñòâî ïîòîêîâ), Type è LocalPort.Íàïðèìåð, âîò òàê:my $serever = IO::Socket::INET->new(LocalPort => $server_port,Type => SOCK_STREAM, Listen => 10);while($client = $server->accept()){... # îáðàáîòêà ýòîãî ñîåäèíåíèÿ}Ïîñëå îòêðûòèÿ ñîêåòà íà îæèäàíèå $server->accept()(ýòî ìåòîä ìîäóëÿ IO::Socket) âîçâðàùàåò ïåðâîå óñòàíîâëåííîåñîåäèíåíèå, ñ êîòîðûì ìû ìîæåì ðàáîòàòüàíàëîãè÷íî $socket èç ïåðâîãî ïðèìåðà. Âñå òîæå ñàìîå ìîæíî ñäåëàòü è íà áîëåå íèçêîì óðîâíå,èñïîëüçóÿ ìîäóëü Socket, êîòîðûé ïî ñâîèì âîçìîæíîñòÿìïîëíîñòüþ àíàëîãè÷åí ñîîòâåòñòâóþùåé áèáëèîòåêåC, òàê ÷òî man socket íàì ïîìîæåò.Ñëåäóþùèé íàáîð ìîäóëåé, êîòîðûé ìîæåòáûòü ïîëåçåí — Net::*. Ýòè ìîäóëè ñòîèò èñïîëüçîâàòü,åñëè íóæíà ðàáîòà ñî ñòàíäàðòíûìè ñåðâèñàìè,òàêèìè êàê Telnet, SMTP, FTP (Net::Telnet,Net::SMTP, Net::FTP ñîîòâåòñòâåííî). Ïîìèìî âûøåïåðå÷èñëåííûõìîäóëåé, â ðàìêàõ ýòîé áèáëèîòåêèðåàëèçîâàíà öåëàÿ êó÷à ïðîñòî î÷åíü ïîëåçíûõìîäóëåé (Net::IP, Net::TCP, Net::HTTP, Net::Gen,Net:Inet ...), ôóíêöèîíàë êîòîðûõ ïîíÿòåí èç íàçâàíèÿ.Net::Gen è Net::Inet — ðàáîòà ñ ñîêåòàìè,Net::TCP — ðàáîòà ñ tcp-ñîêåòàìè (ïîâåðõ òåõ æåNet::Inet è Net::Gen), Net::IP — ðàñøèðåíèå äëÿ âñåâîçìîæíûõïðåîáðàçîâàíèé IP-àäðåñîâ, Net::HTTP —íèçêîóðîâíåâàÿ ðàáîòà ñ http íà ñòîðîíå êëèåíòà èòàê äàëåå.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!