register globals pavojus
by neworld on Rgp.13, 2007, under php, Programavimas, Sagumas
Šiandien parašysių apie šitą pavojų. Kas tai galite pažiūrėti čia: http://www.php.net/register_globals
Iš pažiūros tai gal ir patogus dalykas, tačiau patariu niekam nenaudoti jo. Juolab jog ateities php versijos šio palaikymo neturės. Panagrinėsiu du pavojingus atvejus ir būda kaip tai ištaisyti.
Taigi pirmasis atvejąs:
Tarkime turime autorizacijos kodą:
admin.php:
[code lang="php"]
if (($name=="admin") and ($psw=="Niekas nezino")) {
$autorization=true;
}
if ($autorization==true) {
define("CHECH","Tikras");//padarom konstantą kad control.php būtų garantuotas jog jis yra includinamas iš čia
include('control.php');
} else {
die('Neturite teisių');
}
?>[/code]
Kodas labai paprastas. Taigi kas būtų jeigu naršyklėje parašytume “admin.php?autorization=1″? Ogi pirma kodo dalis šios reikšmės nepakeistų o antroje būtų lyg jungtusi ir adminas. Šita problema išsipręstų, jeigu po pirmojo if sakinio padėtume “else { $autorization=false; }”. Tačiau, žinom jog kuo trumpesnis php kodas, tuo jis sgreičiau veikia, tad stengiamės naudoti pirmąjį variantą, tiesa?
O dabar antrasis variantas:
kodas.php
[code lang="php"]
if (is_num($_POST['num']) {
$numeris=$_POST['num'];
}
$_SESSION['numeris']=$numeris;
?>[/code]
Atrodo visai gražus, tavrkingas saugus kodas. Jug patikrinam ar $_POST['num'] yra numeris. Tačiau su register globals mes vistiek galime i sesiją įrašyti belekokią reikšmę
Čia dar niekai palyginus kiek galima pridirbti su sesijom, nes sesijos kintameji irgi tapa kintamaisiais.
Taigi kaip apsisaugoti.
Pirma taisyklė niekada nenaudoti register globals.
Antra taisyklė: jeigu serveris vis dėlto palaiko šį dalyką, ir jūs niekaip negalite jo išjungti, tada visus sesijos kintamųjų pavadinimus įsivardinkite pavadinimais, kurių visam kode nanaudosite kaip kintamųjų. Sakykim $_SESSION['mysession_prisijungimas']; Abejoju ar visam kode panaudosite $mysession_prisijungimas, be to hackeriams baveik neįmanoma atspėti šio derinio.
Tada scripto pradžioje įsidėkite šį kodą:
[code lang="php"]if (ini_get(register_globals)) // If register_globals is enabled
{ // Unset $_GET keys
foreach ($_GET as $get_key => $get_value) {
if (ereg('^([a-zA-Z]|_){1}([a-zA-Z0-9]|_)*$', $get_key)) eval("unset(\${$get_key});");
} // Unset $_POST keys
foreach ($_POST as $post_key => $post_value) {
if (ereg('^([a-zA-Z]|_){1}([a-zA-Z0-9]|_)*$', $post_key)) eval("unset(\${$post_key});");
} // Unset $_REQUEST keys
foreach ($_REQUEST as $request_key => $request_value) {
if (ereg('^([a-zA-Z]|_){1}([a-zA-Z0-9]|_)*$', $request_key)) eval("unset(\${$request_key});");
}
}[/code]
Šis kodas panakins visus kintamuosius sukurtus per register globals (išskyrus sesijos kintamuosius).
Jei visdėlto negalite vadovautis pirma ir antra taisyklė, tai tada:
Niekada nenaudokite 3party kodo (nes hackeriai tiksliai žinos visas spragas paliktus register globals).
Niekam nedalinkite savo kodo.
Stenkitės kurti savo unikalius pavadinimus kintamiesiems.
Stenkitės rašyti pilnas salygas, kad esant klaidingom reikšmėm, kintamieji pasieksitų neprisklausomai nuo register globals
Taip pat vadovaukites antros taisyklės pirma dalimi.
Taigi, jeigu šis tekstas privers bent 1% perkaičiusių žmonių atsisakyti šio dalyko, reiškias man pavyko.
Gruodis 16th, 2007 on 11:04:43
man neveikia
Gruodis 16th, 2007 on 11:06:33
tie kodai
Sausis 6th, 2008 on 16:40:38
o tu bent supratai apie ką kalba eina?
Balandis 18th, 2009 on 14:11:17
reikes pabandyti issideti manyciau mano tinklapiui pravers
Balandis 20th, 2009 on 17:18:14
Pirma per phpinfo() pasižiūrėk ar jie įjungti. Jeigu įjungti, gali mėginti per htaccess išjungti (net nežinau ar veiks, nes apache seniai nebenaudoju)
Balandis 22nd, 2009 on 17:33:43
tai pas mane ne per apache o per tinklalapis.net
Balandis 22nd, 2009 on 19:58:25
Ten man rdos jie ar taip ar taip išjungti. Man šito skripto prireikė kai atsikrausčiau į domenas.net (kurį nupirko iv.lt)
Balandis 23rd, 2009 on 13:53:17
ai as tai ji issidejau ir niekas nebelauzia mano tinklapio
Balandis 23rd, 2009 on 16:51:22
Tai puiku
Balandis 27th, 2009 on 20:47:16
hmm tinklapio nenulauzia bet snd vel buvo priflodine :/ gal dar turi kokiu apsaugeliu del registracijos ? tarkim kad butu galima reg tik kad 30s
Balandis 28th, 2009 on 18:07:31
Įdėk cacphą
Balandis 29th, 2009 on 14:49:50
o gal turi tu ta kapcha ? nes as jo nerandu :/
Balandis 29th, 2009 on 16:56:56
na capcha yra tas paveiksliukas, reikalingas registruojantis. Aš galiu duoti savąjį capchos variantą
Balandis 30th, 2009 on 15:21:07
nu jeigu gali duok nes man kuriuos is vebo parsisiunciau neveikia :/
Balandis 30th, 2009 on 16:01:54
Tai tada aš įdėsiu į šitą blogą
Balandis 30th, 2009 on 21:56:13
dekoju bet man nebereikia radau stai toki http://www.white-hat-web-design.co.uk/articles/php-captcha.php
ir supratau visa veikima bet manau gali ideti kitiems apsilankiusiems cia pravers
Gruodis 12th, 2011 on 19:36:57
Man viskas puikiai veikia. Dėkingas už info.
Spalis 10th, 2013 on 17:43:45
http://haleupcu.wordpress.com