PHP saugumas: Saugus programinis kodas. 1 dalis.
Vietoj įžangos
Šiuo pirmu įrašu norėčiau pradėti “paskaitų ciklą” apie teisingą programavimą. Informacija bus pateikiama ne tik iš mano asmeninės patirties, bet ir iš kitų šaltiniu. Tikrai nesakau, kad viską aš čia surašysiu, bet tai bus puiki pradžia. Reiktų atkreipti dėmesį į tai, kad su bet kuria programavimo kalba galima programuoti tiek saugiai, tiek ne. Kadangi PHP yra populiariausia programavimo kalba bei mano duona – mano kalba bus daug labiau pritaikyta PHP.
Ši pateikta informacija skirta mokymosi tikslams, kad jaunieji kolegos programuotojai išmoktų rašyti saugų kodą. Aš atsiriboju nuo bet kokio kenksmingo informacijos panaudojimo. Aš esu už saugų internetą / saugias svetaines.
Kurdami, bet kokią programą ir tiesa pasakius bet kokia programavimo kalba reikia būti iš dalies paranojiku. Bet kokia gaunama informacija iš vartotojo yra nepatikima. Tad ji privalo įgyti jūsų pasitikėjimą kiekvieną kartą. Manyčiau reikia atkreipti į šiuos faktus:
- Vartotojas nežino kaip veikia programa, nežino ką žinot jūs, jis gali atlikti veiksmus tokius dėl kurių programa gali atlikti neįtikėtinus veiksmus.
- Vartotojas gali stengtis ieškoti klaidų ir išnaudoti savo tikslams
- Internetas ne visuomet veikia gerai. Tai jis per lėtas, tai nenusiunčiami visi paketai dėl to jūsų programinis kodas gali veikti neįtikėtinai keistai.
- Pati programavimo kalba gali turėti klaidų apie kurias jūs net nežinojote, o jei žinote ir naudojat per senas PHP versijas galite nukentėti ir dėlto.
- Ir dar kiti neįtikėtini veiksniai kurie nepriklauso nuo jūsų, bei jūsų įpročių.
Niekas negimė mokėdamas. Blogiausia, kad turbūt visi mes mokomės iš savo klaidų. Yra tikras menas išmokti iš kitų klaidų arba atradimų. Tad tikiuosi ši informacija jums padės. Nemanau, kad pavyks viską aprašyti, bet esminius dalykus manau paminėsiu. Malonaus skaitymo.. prie kavutės.
Pirma paskaita kiek suprantu labiausiai skirta begineriams, tačiau man pasirodė visai įdomi mintis pirmus kintamųjų simbolius paskirti jų tipo aprašymui. Manau, kad pritaikysiu tai :).
P.S. Tik derėtų patiems pasitestuoti OXID'ą savo prieš kalbant apie error notice'us ir tt :). Error notice'ų ir dar keletą nelabai reikšmingų dalykėlių galima išgauti pažaidus su OXID'o linkais, bei loginu į adminą, kai vykdomas prisijungimas, ir nurodomas pvz neegzistuojantis metodas. Hint: HTML'o komentarai yra matomi viešai, tai geriau jais nekomentuokit to, ko vartotojas neturi matyti :)
Žinau apie OXID kliurkas, deja ne aš ne oxido teame sėdžiu, tad nei klaidų taisyti, nei kažką įsakinėti jiems negaliu.
Tada liuks :). Turi visišką moralinę teisę skelbti tai ką skelbi :)
Žilvinas:
Manau galima skelbti ir savo klaidas :D, kiekvienas juk darėm elementarias klaidas (o kartais ir padarom ir dabar iš tingėjom)… o po to persiauklėjam ir stengiamės nedaryti blogai.
Aš ir nesakau, kad negalima skelbti savo klaidų. Tačiau manau, kad prieš skelbiant jos turėtų būti ištaisomos, antraip aš tai traktuoju kaip apsileidimą :)
Publikuotoje versijoje nebūtina išjungti error_reporting'o. Galima išjungti nustatymą "display_errors" ir įjungti "log_errors". Taip jokie klaidų pranešimai nedings, tačiau lankytojai jų irgi nepamatys.
Post`as tikrai neblogas, bet, Vaidai, pagailėk mūsų akių… Na tikrai po kelių minučių skaitymo paskausta įžiūrinėt.
tamole: visa esmė, kad publikuotam projekte klaidų rodymas yra blogai, o kad loginti klaidas reiktų – tai faktas.
webdunlis: na jei rasiu ką nors įdomaus… atnaujinsiu.
Kaip ten su tuo (int)$kintamasis buvo?..
pypt:
kadangi nebuvo apdoroti gaunami duomenys, buvo galima padaryti sql injectioną. Užklausa atrodė kažkas panašiai į tai
$q= "SELECT * from darbuotojai where id='". $_GET['darbuotojo_id'] ."'";
jie išsprendė paprastai: (int)$_GET['darbuotojo_id'],
o kitose vietose, kur buvo pavaizduotas šis id liko nesutvarkyta. Tad XSS ataka veikė. Bet parašius dar kartą apie jų klaidą, jie ištaisė teisingai.
[…] taip pat: meilė estams ar nemeilė rusams?, serialas apie saugų kodą, mūsų piratų atkaklumas, sveikatos televizoriui stygius ir bomba […]
[…] straipsnis “PHP saugumas: Saugus programinis kodas. 1 dalis.” Susiję straipsniai:PHP saugumo nustatymai – 2 dalisPHP saugumo nustatymai – 1 dalisAsmens […]
Hungarian notation… Viešpatie apsaugok…
Daugiau viskas kaip ir neblogai :-).
siaip smalsumo delei ar labai didele blogybe jeigu visur naudoju
if ()
{
}
ar
for ()
{
}
? Man kodas taip daug aiskesnis.. visada daug lengviau surasti pradzia ir pabaiga.. nei { zenklas eilutes pabaigoje…
vėl labas, ačiū už atsakymą, bet tarkim aš supratau, kad tavo pozicija yra naudoti is_numeric() prieš (int).
aš, tarkim, dabar nematau problemos padaryt kažką tokio:
$_REQUEST['skaicius'] = (int)$_REQUEST['skaicius'];
ar tai yra kokiu nors būdu insecure?
klausiu ne su kokia ironija ar pasikėlimu, tiesiog gal ko nors nežinau :)
Darius: kaip tik gerai, tik aš labiau mėgstu pats naudoti
if () {
}
pypt: jei tu taip apsidoroji kintamaji ir naudoji apdorota… tai gerai, blogai yra kai vienoje vietoje tai padarai, o kitose pamirsti.