КампутарыПраграмнае забеспячэнне

PHP глабальная пераменная ў функцыі. Зрабіць зменную глабальнай у PHP

Для стварэння паўнавартаснага сайта, які валодае шырокім функцыяналам неабходна ведаць пра многае. Але тое, што можа надаць яму сапраўдную ўнікальнасць - гэта PHP. Глабальная пераменная ў гэтай мове праграмавання выкарыстоўваецца не вельмі часта, але часам ведаць, як яна працуе, бывае проста неабходна. Вось вывучэннем таго, чым яна з'яўляецца і як працуе, мы і зоймемся ў дадзеным артыкуле.

Вобласць бачнасці

Так называюць кантэкст, у рамках якога і вызначаецца пераменная. У большасці выпадкаў яны маюць толькі адну вобласць бачнасці. Калі ў PHP глабальныя зменныя падгружаюцца з іншых файлаў, то ў ёй яны могуць быць ўключаем (include) і патрабаванымі (require).

Па змаўчанні яны абмежаваныя лакальнай вобласцю бачнасці функцыі. А як зрабіць, каб зменную бачылі файлы за яе межамі, прычым маглі б яшчэ і выкарыстоўваць? Для гэтага і прадугледжана ў PHP глабальную зменную.

Ключавое слова "global"

А вось як абвясціць глабальную зменную PHP? У дасягненні гэтай мэты нам дапаможа слова "global". Размяшчаць яго неабходна перад зменнай, якую неабходна зрабіць глабальнай (наример, global «Ясна»).

Пасля ажыццяўлення такога ўказанні, працаваць з дадзенымі зможа любы файл. Калі дзе-то маюцца спасылкі на гэтую зменную, то заўсёды праграма будзе звяртаць увагу менавіта на глабальную версію.

Чаму такая дзіўная фармулёўка? Справа ў тым, што адначасова з гэтым могуць існаваць і лакальныя версіі. Але даступнымі яны будуць выключна ў тых файлах, дзе абвешчаныя. А для ўсіх астатніх будуць дзейнічаць глабальныя зменныя класа PHP. Таму неабходна быць асцярожным. І каб не было сумневаў, вось вам прыклад, як яны выглядаюць: global a.

Паколькі, калі адзін файл будзе мець доступ да некалькіх пераменным, гэта выкліча іх канфлікт. Але тут нельга дакладна сказаць - лакальная або глабальная пераменная будзе счытвацца, ці ж і зусім паўстане памылка. Так, калі яе прапісаць ўнутры функцыі, то праблем быць не павінна. Але выкарыстанне зменнай за яе межамі будзе праблематычным. Таму неабходна ўважліва сачыць за структурай складання праграмнага кода і пераконвацца, што нідзе няма нават перадумоў для таго, каб паўстаў згаданы канфлікт.

Іншы варыянт запісу

Ці можна ў PHP стварыць глабальную зменную іншым спосабам? Так, і нават не адным. Для пачатку давайце разгледзім $ GLOBALS. Гэта асацыятыўны масіў. Ключ ў ім - гэта імя. У якасці значэння выступае змесціва глабальнай зменнай. Варта адзначыць, што дадзены масіў пасля абвяшчэння існуе ў любой вобласці бачнасці. Гэта дае падставы лічыць яго суперглобальным. Выглядае ён такім чынам: $ GLOBALS [ 'Ясна'].

Наканаванымі / суперглобальные зменныя

У кожнай мове праграмавання ёсць нейкія імёны, што зафрахтаваны для яго асобных функцый. Таму ствараць у PHP глабальныя зменныя аднайменнымі не атрымаецца.

У гэтай мове праграмавання маюцца свае асаблівасці. Так, важным з'яўляецца тое, што наканаваны зменныя тут не маюць ўстаноўкі «супер», гэта значыць яны даступныя не ва ўсіх месцах. Як жа гэта выправіць? Каб наканаванымі зменная была даступная ў нейкай лакальнай вобласці, яе неабходна аб'яўляць наступным чынам: global «Ясна». Быццам бы тое самае, што і раней распавядалася, праўда? Дакладна, ды не зусім. Давайце разгледзім ўжо «баявой» прыклад:

  • global $ HTTP_POST_VARS;
  • echo $ HTTP_POST_VARS [ 'name'].

Адчуваеце розніцу паміж імі? Майце на ўвазе, што ў PHP глабальную зменную не абавязкова павінна быць выкарыстана ў рамках функцыі. Яна наогул можа быць размешчана ў файле, які ў яе ўключаецца.

Спасылкі і бяспека

Як бачыце, у PHP стварыць глабальную зменную не праблема. А вось ці ёсць нейкія асаблівасці адносна спасылак? Так, можа быць нечаканае паводзіны пры выкарыстанні global. Але перад гэтым невялікая перадгісторыя.

У версіі 4.2.0 дырэктыва register_globals па змаўчанні змянілася з уключанага стану на выключаны. Для большасці карыстальнікаў гэта не вельмі важна, а дарма. Бо гэта напрамую адбіваецца на бяспецы распрацоўванага прадукту. Калі вам неабходна зрабіць зменную глабальнай, PHP-дырэктыва на гэты параметр непасрэдна не паўплывае. Але некарэктнае выкарыстанне ўжо можа стварыць прэцэдэнты бяспекі.

Так, калі register_globals знаходзіцца ва ўключаным стане, то перад выкананнем напісанага кода ініцыялізуюцца розныя зменныя, якія неабходныя, напрыклад, каб адпраўляць HTML-формы. Таму і было прынята рашэнне адключыць яе.

Чаму станам дадзенай дырэктывы ў php глабальная пераменная абавязана многім? Справа ў тым, што пры ўключаным стане распрацоўшчыкі не заўсёды з упэўненасць маглі самі сабе адказаць на пытанне, адкуль яна прыйшла. З аднаго боку, гэта аблягчала напісанне кода. Але з іншага - гэта стварала пагрозу бяспецы. Таму, каб пазбегнуць памылак, а таксама мяшання дадзеных і была адключаная дырэктыва.

А цяпер давайце разгледзім ня / бяспечны код, а таксама як выявіць выпадкі, калі аб'ява глабальнай зменнай PHP суправаджаецца спробамі падмены дадзеных. Гэта неабходна для таго, каб ствараць не толькі прыгожыя, але і стабільна працуюць сайты, якія не узламае першы які трапіў чалавек.

небяспечны код

Давайце ўсталюем, што пераменная з'яўляецца праўдзівай для тых, хто прайшоў аўтарызацыю:

if (authenticate_user ()) {
$ Authorize = true;
}

if ($ authorize) {
include "/highly/sensitive/data.php";
}

У дадзеным стане пераменная можа ўсталёўвацца аўтаматычна. Улічваючы, што дадзеныя могуць быць папросту замененыя, і крыніца іх паходжання не ўсталёўваецца, то любы чалавек можа прайсці такую праверку і выдаць сябе за кагосьці іншага. Пры жаданні, зламыснікам (ці проста цікаўным, але неспрактыкаваным чалавекам) можа быць парушаная логіка працы скрыпту.

Калі ж змяніць значэнне дырэктывы, то дадзены код зможа працаваць карэктна, як нам і патрабуецца. Але ініцыялізацыя зменных з'яўляецца не толькі добрым тонам у праграмаванні, але і дае нам пэўныя гарантыі стабільнасці працы скрыпту.

Надзейны варыянт кода

Для дасягнення гэтай мэты можна або выключыць работу дырэктывы, або прапісаць больш складаны код. Напрыклад, вось такі:

if (isset ($ _ SESSION [ 'username'])) {

echo "Прывітанне {$ _ SESSION [ 'username']} ";

} Else {

echo "Прывітанне Guest
";
echo "Вітаю, карыстальнік!";

}

Зрабіць падмену ў гэтым выпадку ўжо будзе складана. Але ўсё ж - магчыма. Для гэтага неабходна клапоціцца аб тым, каб былі прадугледжаны інструменты аператыўнага рэагавання. Калі неабходна ў PHP ўключыць глабальныя зменныя, то можна выкарыстоўваць наступны інструмент: калі мы ведаем, у якім дыяпазоне будзе атрыманае значэнне, можна прапісаць, каб скрыпт правяраў гэта з дапамогай супастаўлення. Вядома, гэта таксама не гарантуе паўнавартасную абарону ад падмены значэнняў. Але вось перабор магчымых варыянтаў значна ўскладніць.

Знаходзіць спробу падмены

Давайце праверым, як вы зразумелі напісанае раней. У PHP глабальныя зменныя ў функцыі, што будзе прадастаўлена ніжэй, вам неабходна будзе аб'явіць самастойна. Можна сказаць, што гэта ў пэўным сэнсе хатняе заданне па засвойванню тэмы ўрока. Вось код:

if (isset ($ _ COOKIE [ 'C_COOKIE'])) {
} Elseif (isset ($ _ GET [ 'C_COOKIE']) || isset ($ _ POST [ 'C_COOKIE'])) {

mail ( "administrarot@example.com", "Увага, скрыптам была зафіксавана спроба ўзлому і падмены дадзеных", $ _SERVER [ 'REMOTE_ADDR']);
echo "Была парушаная бяспеку ці спроба так зрабіць. Адміністратар уведомлён";
exit;

} Else {
}
?>

А цяпер тлумачэнні да яго. Пераменная C_COOKIE прыходзіць да нас з пэўнай крыніцы. Каб цалкам у пераканаецца ў адпаведнасці выніку чаканага, мы правяраем яе значэнне і ў выпадку праблем паведамляем пра гэта адміністратара. Калі ж нічога не прыйшло, то ніякіх дзеянняў і не трэба здзяйсняць. Трэба разумець, што простае адключэнне дырэктывы register_globals ня робіць ваш код бяспечным. Таму любая зменная, якую атрымлівае скрыпт ад карыстальніка, павінна быць праверана на чаканае значэнне.

заключэнне

Вось, увогуле, і ўсё, што неабходна ведаць пра глабальныя зменныя, каб паспяхова і бяспечна выкарыстоўваць іх у сваёй дзейнасці. Вядома, сказаць, што існуе паўнавартасная гарантыя таго, што імі ніхто не скарыстаецца нельга - узломшчыкі пастаянна ўдасканальваюць свае метады і ўменні. Таму пажадана па максімуму абмежаваць выкарыстанне глабальных зменных у кодзе. Балазе, структура і асаблівасці пабудовы гэтай мовы праграмавання дазваляюць дасягнуць гэтай мэты. Поспехаў!

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 be.delachieve.com. Theme powered by WordPress.