Telli ja loe
kõige huvitavam
artiklid kõigepealt!

Täisots on lihtsa 4 tähega. Lõbusaid fakte seksi kohta, mida keegi pole sulle varem rääkinud

Tere. Minu nimi on Sasha Barannik. Mail.Ru Groupis juhin veebiarendusosakonda, mis koosneb 15 töötajast. Oleme õppinud, kuidas luua saite kümnete miljonite kasutajate jaoks ja saame hõlpsalt hakkama mitme miljoni igapäevase vaatajaskonnaga. Olen ise veebiarendusega tegelenud ca 20 aastat ja viimased 15 tööaastat on programmeerimine olnud valdavalt PHP-s. Kuigi keele võimalused ja lähenemine arendusele on selle aja jooksul palju muutunud, jääb peamiste haavatavuste mõistmine ja nende eest kaitsmise oskus iga arendaja jaoks võtmeoskusteks.

Internetis on turvalisuse kohta palju artikleid ja juhendeid. See raamat tundus mulle üsna üksikasjalik, kuid samas sisutihe ja arusaadav. Loodan, et see aitab teil õppida midagi uut ning muuta teie saidid turvalisemaks ja usaldusväärsemaks.

P.S. Raamat on pikk, nii et tõlge jagatakse mitmes artiklis. Nii et alustame...

Veel üks raamat PHP turvalisuse kohta? PHP turvaraamatu käivitamiseks on palju võimalusi. Kahjuks ei lugenud ma ühtegi neist läbi, seega pean sellega kirjutamise käigus tegelema. Võib-olla alustan kõige elementaarsemast ja loodan, et kõik saab korda.

Kui võtta arvesse ettevõtte X poolt veebis käivitatud abstraktset veebirakendust, võime eeldada, et see sisaldab mitmeid komponente, mille sissemurdmine võib põhjustada olulist kahju. Mida näiteks?

  • Kahju kasutajatele: juurdepääsu saamine e-kirjadele, paroolidele, isikuandmetele, pangakaardi üksikasjadele, ärisaladusele, kontaktiloenditele, tehingute ajaloole ja sügavalt kaitstud saladustele (nt keegi paneb oma koerale nimeks Glitter). Nende andmete lekkimine kahjustab kasutajaid (üksikisikuid ja ettevõtteid). Kahju võivad põhjustada ka veebirakendused, mis selliseid andmeid väärkasutavad, ja saidid, mis kasutavad ära kasutajate usaldust.
  • Kahju ettevõttele X endale: kahju kasutajatele toob kaasa maine kahjustamise, hüvitise, olulise äriteabe kadumise, lisakulud, nagu infrastruktuur, turvatäiustused, heastamine, õiguskulud, suured kasud tippjuhtide lahkumisel jne.
  • Keskendun neile kahele kategooriale, sest need sisaldavad enamikku tüütustest, mida veebirakenduste turvalisus peaks ära hoidma. Kõik ettevõtted, kes on kokku puutunud tõsiste turvarikkumistega, kirjutavad kiiresti pressiteadetesse ja veebisaitidele, kuidas nad selle vastu tunnevad. Seega soovitan teil enne selle probleemiga praktikas kokku puutumist kogu südamest tunnetada selle probleemi tähtsust.

    Kahjuks lahenevad turvaprobleemid sageli tagantjärele. Arvatakse, et kõige olulisem on luua töötav, kasutajate vajadustele vastav rakendus, millel on vastuvõetav eelarve ja ajavahemik. See on arusaadav prioriteetide kogum, kuid te ei saa turvalisust igavesti ignoreerida. Palju parem on seda alati meeles pidada, rakendades arenduse käigus konkreetseid otsuseid, kui muudatuste maksumus on madal.

    Sekundaarne turvalisus on suuresti programmeerimiskultuuri tulemus. Mõned programmeerijad löövad haavatavusele mõeldes külma higi, samas kui teised võivad haavatavuse olemasolu vaidlustada, kuni suudavad tõestada, et see pole haavatavus. Nende kahe äärmuse vahel on palju programmeerijaid, kes kehitavad lihtsalt õlgu, sest nad pole veel valesti läinud. Seda kummalist maailma on neil raske mõista.

    Kuna veebirakenduse turvasüsteem peab kaitsma kasutajaid, kes usaldavad rakenduse teenuseid, siis on vaja teada vastuseid küsimustele:

  • Kes tahab meid rünnata?
  • Kuidas nad saavad meid rünnata?
  • Kuidas me saame neid peatada?
  • Kes tahab meid rünnata? Vastus esimesele küsimusele on väga lihtne: kõik ja kõik. Jah, kogu universum tahab sulle õppetunni anda. Kas laps, kellel on ülekiirendatud arvuti, milles töötab Kali Linux? Tõenäoliselt ta juba ründas sind. Kahtlane mees, kellele meeldib keppe ratastesse ajada? Tõenäoliselt palkas ta juba kellegi sind ründama. Usaldusväärne REST API, mille kaudu saate andmeid tunnis? Tõenäoliselt häkiti see sisse kuu aega tagasi, et anda teile nakatunud andmeid. Isegi mina võin sind rünnata! Nii et ärge pimesi seda raamatut uskuge. Mõtle, et ma valetan. Ja leidke programmeerija, kes toob mind puhta vee juurde ja avalikustab mu halvad nõuanded. Teisest küljest võib-olla hakkab ta sind ka häkkima...

    Selle paranoia mõte on hõlbustada kõigi teie veebirakendusega suhtlevate asjade (kasutaja, häkker, andmebaas, ebausaldusväärne sisend, haldur, REST API) vaimset kategoriseerimist ja seejärel määrata igale kategooriale usaldusindeks. Ilmselgelt ei saa "häkkerit" usaldada, aga kuidas on lood "andmebaasi"? "Ebausaldusväärne sisend" sai oma nime põhjusel, kuid kas tõesti filtreeriksite ajaveebipostituse kolleegi usaldusväärsest Atomi voost?

    Need, kes soovivad veebirakenduste häkkimist tõsiselt, õpivad seda mõtteviisi ära kasutama, rünnates sagedamini mitte haavatavaid andmeallikaid, vaid usaldusväärseid andmeallikaid, millel on vähem tõenäoline, et neil on hea kaitsesüsteem. See pole juhuslik otsus: päriselus äratavad kõrgema usaldusindeksiga katsealused vähem kahtlust. Just nendele andmeallikatele pööran rakendust analüüsides eelkõige tähelepanu.

    Tuleme tagasi andmebaaside juurde. Eeldades, et häkker pääseb andmebaasile juurde (ja meie, paranoikud, eeldame alati), ei saa seda kunagi usaldada. Enamik rakendusi usaldab andmebaase kahtlemata. Väljastpoolt näeb veebirakendus välja ühtse entiteedina, kuid sees on eraldi komponentide süsteem, mis vahetab andmeid. Kui me peame kõiki neid komponente usaldusväärseks, siis kui ühte neist häkitakse, satuvad kõik teised kiiresti ohtu. Selliseid katastroofilisi turvaprobleeme ei saa lahendada lausega "Kui baasi häkitakse, siis me ikkagi kaotasime." Võite nii öelda, kuid see pole sugugi tõsi, et peate seda tegema, kui te algselt baasi ei usalda ja tegutsete vastavalt!

    Kuidas nad saavad meid rünnata? Vastus teisele küsimusele on üsna ulatuslik. Teid võib rünnata kõikjalt, kus veebirakenduse iga komponent või kiht saab oma andmeid. Sisuliselt töötlevad veebirakendused lihtsalt andmeid ja liigutavad neid ühest kohast teise. Kasutajapäringud, andmebaasid, API-d, ajaveebikanalid, vormid, küpsised, hoidlad, PHP keskkonnamuutujad, konfiguratsioonifailid, uuesti konfiguratsioonifailid, isegi teie käivitatavad PHP-failid – kõik need võivad olla nakatunud turvarikkumiste andmete ja kahjustustega. Tegelikult, kui pahatahtlikud andmed päringu jaoks kasutatud PHP-koodis selgesõnaliselt puuduvad, tulevad need tõenäoliselt "kasuliku koormana". See eeldab, et a) kirjutasite PHP lähtekoodi, b) see vaadati korralikult läbi ja c) teile ei makstud kuritegelikud organisatsioonid.

    Kui kasutate andmeallikaid ilma, et kontrolliksite, kas andmed on täiesti ohutud ja kasutuskõlblikud, siis olete potentsiaalselt avatud rünnakutele. Samuti peate kontrollima, kas saadud andmed ühtivad teie saadetud andmetega. Kui andmed ei ole väljavõtmiseks täiesti ohutud, on teil ka tõsiseid probleeme. Seda kõike saab väljendada PHP reeglina “Validate input; pääse väljundist."

    Need on ilmsed andmeallikad, mida peame kuidagi kontrollima. Allikad võivad hõlmata ka kliendipoolseid hoidlaid. Näiteks tunnevad enamik rakendusi kasutajad ära, määrates neile kordumatud seansi ID-d, mida saab salvestada küpsistesse. Kui ründaja saab küpsisest väärtuse, võib ta esineda teise kasutajana. Kuigi me saame maandada mõningaid kasutajaandmete pealtkuulamise või muutmisega seotud riske, ei saa me tagada kasutaja arvuti füüsilist turvalisust. Me ei saa isegi garanteerida, et kasutajad leiavad, et "123456" on "parooli" järel kõige rumalam parool. Vürtsi lisab asjaolu, et tänapäeval pole küpsised ainus kasutajapoolne salvestustüüp.

    Teine sageli tähelepanuta jäetud risk puudutab teie lähtekoodi terviklikkust. PHP-s on muutumas üha populaarsemaks rakenduste arendamine, mis põhinevad suurel hulgal lõdvalt seotud teekidel, moodulitel ja raamistike pakettidel. Paljud neist laaditakse alla avalikest hoidlatest (nt Github), mis on installitud paketiinstalleritega, nagu Composer ja selle veebikaaslane Packagist.org. Seetõttu sõltub lähtekoodi turvalisus täielikult kõigi nende kolmandate osapoolte teenuste ja komponentide turvalisusest. Kui Github on ohustatud, kasutatakse seda tõenäoliselt pahatahtliku lisandiga koodi levitamiseks. Kui Packagist.org – siis saab ründaja paketipäringud ümber suunata enda pahatahtlikesse pakettidesse.

    Praegu mõjutavad Composerit ja Packagist.org-i teadaolevad haavatavused pakettide sõltuvuse tuvastamisel ja levitamisel, seega kontrollige alati kõike oma tootmiskeskkonnas ja kontrollige saidiga Packagist.org kõigi pakettide allikat.

    Kuidas me saame neid peatada? Veebirakenduse turvalisuse murdmine võib olla nii naeruväärselt lihtne kui ka aeganõudev. On õiglane eeldada, et igal veebirakendusel on kuskil haavatavus. Põhjus on lihtne: kõik rakendused on tehtud inimeste poolt ja inimesed teevad vigu. Nii et täiuslik turvalisus on unistus. Kõik rakendused võivad sisaldada turvaauke ja programmeerijate ülesanne on riske minimeerida.

    Peate hoolikalt mõtlema, et vähendada veebirakenduse rünnakust tuleneva kahju tõenäosust. Loo käigus räägin võimalikest ründemeetoditest. Mõned neist on ilmsed, teised mitte. Kuid igal juhul on probleemi lahendamiseks vaja arvestada mõningate turvalisuse põhiprintsiipidega.

    Turvalisuse põhiprintsiibid Turvameetmete kavandamisel saab nende tõhusust hinnata järgmiste kaalutluste põhjal. Mõnda olen juba eespool maininud.
  • Ära usalda kedagi ega midagi.
  • Eeldage alati halvimat stsenaariumi.
  • Rakendage mitmetasandilist kaitset (Defence-in-Depth).
  • Järgige põhimõtet "mida lihtsam, seda parem" (Keep It Simple Stupid, KISS).
  • Järgige "väikseima privileeg" põhimõtet.
  • Ründajad haistavad ebaselgust.
  • Lugege dokumentatsiooni (RTFM), kuid ärge kunagi usaldage seda.
  • Kui seda pole testitud, siis see ei tööta.
  • See on alati sinu süü!
  • Käime lühidalt kõigist punktidest üle.1. Ärge usaldage kedagi ega midagi Nagu eespool mainitud, on õige suhtumine eeldada, et kõik ja kõik, millega teie veebirakendus suhtleb, soovivad seda häkkida. See hõlmab muid rakenduse komponente või kihte, mida on vaja taotluste töötlemiseks. Kõik ja kõik. Pole erandeid.2. Eeldage alati halvimat juhust Paljudel turvasüsteemidel on üks ühine joon: olenemata sellest, kui hästi need on tehtud, võib neid kõiki rikkuda. Kui seda arvesse võtta, mõistate kiiresti teise punkti eelist. Halvimale stsenaariumile keskendumine aitab hinnata rünnaku ulatust ja tõsidust. Ja kui see juhtub, siis võib-olla saate täiendavate kaitsemeetmete ja arhitektuurimuudatuste abil ebameeldivaid tagajärgi vähendada. Võib-olla on teie kasutatav traditsiooniline lahendus juba asendatud millegi paremaga?3. Kasutage süvakaitset Süvakaitse on laenatud sõjateadusest, sest inimesed on ammu aru saanud, et arvukad seinad, liivakotid, varustus, soomusvestid ja kolvid, mis katavad elutähtsaid organeid vaenlase kuulide ja labade eest, on õige lähenemine. ohutus. Kunagi ei tea, milline ülaltoodutest ei kaitse, ja tuleb veenduda, et mitu kaitsetaset võimaldaks toetuda rohkem kui ühele välikindlustusele või lahinguformatsioonile. Muidugi pole asi ainult üksikutes ebaõnnestumistes. Kujutage ette ründajat, kes ronib redelit kasutades mööda hiiglaslikku keskaegset müüri ja avastab, et selle taga on veel üks sein, kust neid nooltega üle külvatakse. Häkkerid tunnevad samamoodi.4. Keep It Simple Stupid (KISS) Parimad kaitsevahendid on alati lihtsad. Neid on lihtne arendada, rakendada, mõista, kasutada ja testida. Lihtsus vähendab vigu, julgustab rakenduste õiget jõudlust ja hõlbustab rakendamist isegi kõige keerulisemates ja vaenulikemates keskkondades.5. Järgida "väiksemate privileegide" põhimõtet Igal teabevahetuses osalejal (kasutaja, protsessi, programmi) peaks olema ainult need juurdepääsuõigused, mida ta vajab oma funktsioonide täitmiseks.6. Ründajad haistavad hämarust "Turvalisus läbi ähmasuse" põhineb eeldusel, et kui sa kasutad kaitset A ja ei räägi kellelegi, mis see on, kuidas see töötab või isegi eksisteerib, siis see aitab sind võluväel, sest ründajad on segaduses. Tegelikult annab see vaid väikese eelise. Sageli saab osav ründaja aru, mida olete teinud, seega peate kasutama ka selgeid kaitsemeetmeid. Illusioonidest vabanemise nimel tuleks eriliselt karistada neid, kes on üleliigselt veendunud, et ebamäärane kaitse välistab vajaduse tõelise järele.7. Lugege dokumentatsiooni (RTFM), kuid ärge kunagi usaldage seda PHP käsiraamat on piibel. Loomulikult ei ole seda kirjutanud Lendav Spaghetti Monster, nii et tehniliselt võib see sisaldada mitmeid pooltõdesid, väljajätmisi, väärtõlgendusi või vigu, mida pole veel märgatud või parandatud. Sama kehtib ka Stack Overflow kohta.

    Spetsiaalsed turvatarkuste allikad (keskendunud PHP-le ja kaugemale) annavad üldiselt üksikasjalikumaid teadmisi. PHP turvapiiblile kõige lähemal on OWASP, mis sisaldab artikleid, õpetusi ja näpunäiteid. Kui OWASP-is midagi heidutab, ärge kunagi tehke seda!

    8. Kui seda ei ole testitud, siis see ei tööta Kaitsete rakendamisel peate kirjutama kõik vajalikud testid, et kontrollida nende toimimist. Sealhulgas teeskle, et oled häkker, kelle pärast vangla nutab. See võib tunduda kaugeleulatuv, kuid veebirakenduste häkkimise tehnikate tundmine on hea tava; saate teada võimalikest haavatavustest ja teie paranoia suureneb. Samas ei pea juhtkonnale rääkima äsja omandatud tänutundest veebirakenduse häkkimise eest. Kasutage turvaaukude tuvastamiseks kindlasti automatiseeritud tööriistu. Need on kasulikud, kuid loomulikult ei asenda need kvaliteedikoodide ülevaatamist ega isegi rakenduse käsitsi testimist. Mida rohkem ressursse testimisele kulutate, seda usaldusväärsem on teie rakendus.9. See on alati sinu süü! Programmeerijad on harjunud uskuma, et turvanõrkused leitakse hajutatud rünnakutena ja nende tagajärjed on tühised.

    Näiteks peetakse andmetega seotud rikkumisi (hästi dokumenteeritud ja laialt levinud häkkimise tüüp) sageli väikesteks turvaprobleemideks, kuna need ei mõjuta kasutajaid otseselt. Siiski on edukaks rünnakuks sageli hädavajalik info lekkimine tarkvaraversioonide, arenduskeelte, lähtekoodi asukohtade, rakenduste loogika ja äriloogika, andmebaasi struktuuri ning muude veebirakenduste keskkonna ja sisemiste toimingute aspektide kohta.

    Samas on turvasüsteemide rünnakud sageli rünnakute kombinatsioonid. Üksiti on need tähtsusetud, kuid samas avavad mõnikord tee ka teistele rünnakutele. Näiteks SQL-i süstimiseks on mõnikord vaja konkreetset kasutajanime, mille saab hankida Timing Attacki abil administratiivse liidese vastu, mitte palju kallima ja märgatavama toore jõu asemel. SQL-i süstimine võimaldab omakorda rakendada XSS-i rünnakut konkreetsele administraatorikontole, ilma et see juhiks tähelepanu suurele hulgale kahtlastele logikirjetele.

    Haavatavust eraldi vaadeldes seisneb oht nende ohu alahindamises ja seetõttu liiga hoolimatus kohtlemises. Programmeerijad on sageli liiga laisad, et haavatavust parandada, kuna peavad seda liiga väikeseks. Samuti harjutatakse vastutust turvalise arenduse eest nihutama lõppprogrammeerijatele või kasutajatele ja sageli ilma konkreetseid probleeme dokumenteerimata: isegi nende turvaaukude olemasolu ei tunnistata.

    Näiline tähtsusetus pole oluline. On vastutustundetu sundida programmeerijaid või kasutajaid oma turvaauke parandama, eriti kui te neist isegi ei teavitanud.

    Sisestuse valideerimine Sisendvalideerimine on teie veebirakenduse kaitseväli. See kaitseb põhilist äriloogikat, andmetöötlust ja väljundi genereerimist. Sõna otseses mõttes peetakse vaenlase territooriumiks kõike, mis jääb sellest perimeetrist välja, välja arvatud praeguse päringu poolt täidetav kood. Kõiki võimalikke perimeetri sisse- ja väljapääsusid valvavad päeval ja öösel sõjakad vahimehed, kes tulistavad esimesena ja esitavad küsimusi hiljem. Perimeetriga on ühendatud eraldi valvatavad (ja väga kahtlase välimusega) "liitlased", sealhulgas "mudel", "andmebaas" ja "failisüsteem". Keegi ei taha neid tulistada, aga kui nad õnne proovivad... paugu. Igal liitlasel on oma perimeeter, mis võib meie oma usaldada või mitte.

    Kas mäletate mu sõnu selle kohta, keda saate usaldada? Mitte keegi ja mitte midagi. PHP-maailmas soovitatakse kõikjal mitte usaldada "kasutaja sisendit". See on üks kategooriatest vastavalt usalduse määrale. Eeldades, et kasutajaid ei saa usaldada, arvame, et kõike muud saab usaldada. See on vale. Kasutajad on kõige ilmsem ebausaldusväärne sisendallikas, sest me ei tunne neid ega saa neid kontrollida.

    Valideerimiskriteeriumid Sisestuse valideerimine on nii kõige ilmsem kui ka kõige ebausaldusväärsem veebirakenduse kaitse. Valdav osa haavatavustest on tingitud verifitseerimissüsteemi tõrgetest, mistõttu on väga oluline, et see kaitse osa õigesti töötaks. See võib ebaõnnestuda, kuid järgige siiski järgmisi kaalutlusi. Kohandatud validaatorite juurutamisel ja kolmandate osapoolte valideerimisteeke kasutades pidage alati meeles, et kolmanda osapoole lahendused kalduvad täitma tavalisi ülesandeid ja jätavad välja võtmete valideerimisrutiinid, mida teie rakendus võib vajada. Kui kasutate turvavajadusteks loodud teeke, kontrollige kindlasti nende haavatavusi ja õiget toimimist. Samuti soovitan mitte unustada, et PHP võib ilmutada kummalist ja võib-olla ebaturvalist käitumist. Vaadake seda filtrifunktsioonidest võetud näidet:

    Filter_var("php://example.org", FILTER_VALIDATE_URL);
    Filter töötab probleemideta. Probleem seisneb selles, et aktsepteeritud php:// URL-i saab edastada PHP-funktsioonile, mis loodab saada HTTP-kaugaadressi, selle asemel et tagastada andmeid täitvast PHP-skriptist (PHP-käsitleja kaudu). Haavatavus ilmneb seetõttu, et filtrivalikul pole meetodit, mis piiraks lubatud URI-sid. Kuigi rakendus ootab http, https või mailto linki, mitte mõnda PHP-spetsiifilist URI-d. Sellist liiga üldist lähenemist kontrollimisele tuleb igal juhul vältida.

    Olge konteksti suhtes ettevaatlik Sisestuse valideerimine peaks takistama ebaturvaliste andmete sisestamist oma veebirakendusse. Peamine komistuskivi: Andmete turvakontrolle tehakse tavaliselt ainult esimesel ettenähtud kasutuskorral.

    Oletame, et sain nime sisaldavad andmed. Saan hõlpsalt kontrollida, kas sellel on apostroofid, sidekriipsud, sulgud, tühikud ja terve hulk tähtnumbrilisi Unicode'i märke. Nimetus on kehtivad andmed, mida saab kasutada kuvamiseks (esimene kasutusotstarve). Aga kui kasutada seda kuskil mujal (näiteks andmebaasi päringus), siis on see uues kontekstis. Ja mõned nimes lubatud märgid on selles kontekstis ohtlikud: kui nimi teisendatakse stringiks SQL-i süstimiseks.

    Selgub, et sisendi valideerimine on oma olemuselt ebausaldusväärne. See on kõige tõhusam ühemõtteliselt kehtetute väärtuste kärpimiseks. Öelge, kui miski peab olema täisarv, tähtnumbriline string või HTTP URL. Nendel vormingutel ja väärtustel on oma piirangud ja kui neid õigesti kontrollitakse, kujutavad need endast väiksema tõenäosusega ohtu. Muid väärtusi (piiramatu tekst, GET/POST massiivid ja HTML) on raskem kinnitada ja need sisaldavad tõenäolisemalt pahatahtlikke andmeid.

    Kuna enamasti edastab meie rakendus andmeid kontekstide vahel, ei saa me lihtsalt kõiki sisendeid kontrollida ja tööd tehtuks lugeda. Sisseregistreerimine on vaid esimene kaitseahel, kuid mitte sugugi ainus.

    Lisaks sisendandmete valideerimisele kasutatakse väga sageli kaitsemeetodit, näiteks põgenemist. Sellega kontrollitakse andmete turvalisust iga uue konteksti sisestamisel. Tavaliselt kasutatakse seda meetodit saidiülese skriptimise (XSS) eest kaitsmiseks, kuid see on filtreerimisvahendina nõutav ka paljudes muudes ülesannetes.

    Põgenemine kaitseb väljaminevate andmete vastuvõtja eksliku tõlgendamise eest. Kuid sellest ei piisa – kuna andmed satuvad uude konteksti, on vaja kontrollida konkreetset konteksti.

    Kuigi seda võib vaadelda esialgse sisendi valideerimise dubleerimisena, sobivad täiendavad valideerimisetapid tegelikult paremini praeguses kontekstis, kui andmenõuded on väga erinevad. Näiteks võivad vormilt saadavad andmed sisaldada protsenti. Selle esmakordsel kasutamisel kontrollime, kas väärtus on tõepoolest täisarv. Kuid selle ülekandmisel meie rakendusmudelile võivad tekkida uued nõuded: väärtus peab mahtuma teatud vahemikku, mis on rakenduse äriloogika toimimiseks kohustuslik. Ja kui seda lisakontrolli uues kontekstis ei tehta, võivad tekkida tõsised probleemid.

    Kasutage ainult valgeid, mitte musti loendeid Mustad ja valged nimekirjad on kaks peamist sisendi kontrollimise meetodit. Must tähendab kehtetute andmete kontrollimist ja valge õigete andmete kontrollimist. Lubatud loendisse lisamine on eelistatav, kuna valideerimise käigus edastatakse ainult need andmed, mida ootame. Mustad nimekirjad võtavad omakorda arvesse ainult programmeerijate oletusi kõigi võimalike vigaste andmete kohta, nii et siin on palju lihtsam segadusse sattuda, millestki mööda vaadata või eksida.

    Hea näide on mis tahes valideerimisprotseduur, mis on loodud HTML-i turvaliseks muutmiseks mallis oleva vältimatu väljundi seisukohast. Kui kasutame musta nimekirja, siis peame kontrollima, et HTML ei sisaldaks ohtlikke elemente, atribuute, stiile ega käivitatavat JavaScripti. See on palju tööd ja musta nimekirja põhinevad HTML-i puhastajad suudavad alati ohtlikest koodikombinatsioonidest mööda vaadata. Ja valge nimekirja lisamise tööriistad kõrvaldavad selle ebaselguse, lubades ainult teadaolevaid lubatud elemente ja atribuute. Kõik teised lihtsalt eraldatakse, isoleeritakse või eemaldatakse, olenemata sellest, millised nad on.

    Seega on suurema turvalisuse ja usaldusväärsuse tõttu kõigi kontrolliprotseduuride jaoks eelistatav valge nimekirja lisamine.

    Ärge kunagi proovige sisendandmeid parandada Sisendandmete valideerimisega kaasneb sageli filtreerimine. Kui kontrolli käigus hindame lihtsalt andmete õigsust (positiivse või negatiivse tulemuse väljastamisega), siis filtreerimine muudab kontrollitavaid andmeid nii, et need vastavad kindlatele reeglitele.

    See on tavaliselt mõnevõrra kahjulik. Traditsioonilised filtrid hõlmavad näiteks kõigi märkide, välja arvatud numbrite, eemaldamist telefoninumbritest (kaasa arvatud täiendavad sulud ja sidekriipsud) või tarbetu horisontaalse või vertikaalse tühiku kärpimist. Sellistes olukordades tehakse kuvamis- või edastusvigade kõrvaldamiseks minimaalne puhastus. Siiski võite pahatahtlike andmete blokeerimiseks filtreerimise kasutamisest liialt kippuda.

    Üks sisendi parandamise tagajärg on see, et ründaja saab ennustada teie paranduste mõju. Oletame, et stringi väärtus on vale. Otsite selle üles, kustutate selle ja lõpetate filtreerimise. Mis siis, kui ründaja loob teie filtri petmiseks stringidega eraldatud väärtuse?

    hoiatus(dokument.küpsis);
    Selles näites ei anna lihtsalt märgendi järgi filtreerimine midagi: selgesõnalise märgendi eemaldamisel käsitletakse andmeid täielikult kehtiva HTML-skriptielemendina. Sama võib öelda ka mis tahes kindla vormingu järgi filtreerimise kohta. Kõik see näitab selgelt, miks on võimatu muuta sisendandmete valideerimist rakenduse viimaseks kaitseahelaks.

    Selle asemel, et proovida sisendeid parandada, kasutage lihtsalt valgesse nimekirja kantud validaatorit ja lükake sellised sisestuskatsed täielikult tagasi. Ja kui peate filtreerima, filtreerige alati enne kontrollimist, mitte kunagi pärast.

    Ärge kunagi usaldage väliseid valideerijaid ja jälgige pidevalt haavatavusi. Varem märkisin, et valideerimine on vajalik iga kord, kui andmed uude konteksti üle kantakse. See kehtib ka väljaspool veebirakendust tehtud valideerimise kohta. Need juhtelemendid hõlmavad valideerimist või muid brauseris HTML-vormidele rakendatavaid piiranguid. Vaadake seda vormi HTML 5-st (sildid välja jäetud):

    Rep. Iirimaa Ühendkuningriik
    HTML-vormid võivad sisendandmetele piiranguid seada. Saate piirata valikut fikseeritud üksuste loendiga, määrata miinimum- ja maksimumväärtused ning piirata teksti pikkust. HTML 5 võimalused on veelgi laiemad. Brauserid saavad kontrollida URL-e ja meiliaadresse, kontrollida kuupäevi, numbreid ja vahemikke (kuigi kahe viimase tugi on üsna meelevaldne). Brauserid saavad ka sisendit kinnitada, kasutades malli atribuudis sisalduvaid JavaScripti regulaaravaldisi.

    Kogu selle juhtelementide rohkuse juures ei tohi me unustada, et nende eesmärk on parandada teie rakenduse kasutatavust. Iga ründaja saab luua vormi, mis ei sisalda teie algse vormi piiranguid. Saate isegi luua HTTP-kliendi vormide automatiseeritud täitmiseks!

    Teine näide välistest valideerijatest on andmete hankimine kolmandate osapoolte API-delt, nagu Twitter. Sellel suhtlusvõrgustikul on hea maine ja seda usaldatakse tavaliselt kahtlemata. Aga kuna me oleme paranoilised, siis ärge isegi Twitterit usaldage. Kui see on ohus, sisaldavad selle vastused ebaturvalisi andmeid, milleks me ei ole valmis. Seetõttu rakendage isegi siin oma kontrolli, et mitte millegi korral kaitsetu olla.

    Kui usaldame väliseid kontrollimisvahendeid, on turvaauke mugav jälgida. Näiteks kui HTML-i vorm seab maksimaalsele pikkusele piirangu ja me saame sisendandmeid, mille suurus on jõudnud piirini, siis on loogiline eeldada, et see kasutaja üritab valideerimisest mööda minna. Nii saame registreerida lünki välistes tööriistades ja võtta täiendavaid meetmeid võimalike rünnakute vastu, piirates juurdepääsu või päringute arvu.

    Vältige tüübikonversioone PHP-s PHP ei ole tugevasti trükitud keel ning enamik selle funktsioone ja toiminguid on tüübikindlad. See võib põhjustada tõsiseid probleeme. Pealegi pole eriti haavatavad mitte väärtused ise, vaid valideerijad. Näiteks:

    Assert(0 == "0ABC"); //tagastab TRUE assert(0 == "ABC"); //tagastab TRUE (isegi ilma eesnumbrita!) assert(0 === "0ABC"); //tagastab NULL/Annab hoiatuse, et väidet ei saa kontrollida
    Kui sisend- või väljundväärtused võivad olla stringid, kasutage validaatorite kavandamisel ranget võrdlust ja käsitsi tüübi teisendamist. Näiteks võivad vormid tagastada stringi, nii et kui töötate andmetega, mis peavad olema täisarvud, kontrollige kindlasti nende tüüpi.

    Funktsiooni checkIntegerRange($int, $min, $max) ( if (is_string($int) && !ctype_digit($int)) ( return false; // sisaldab mittekohalisi märke ) if (!is_int((int) $int )) ( return false; // muu mittetäisarv või suurem kui PHP_MAX_INT ) return ($int >= $min && $int = $min && $int array("verify_peer" => TRUE))); $body = file_get_contents("https://api.example.com/search?q=sphinx", false, $kontekst);
    UPD. PHP 5.6+ puhul on suvand ssl.verify_peer vaikimisi seatud väärtusele TRUE.

    CURL-i laiendus sisaldab serveri valideerimist, nii et te ei pea midagi seadistama. Kuid programmeerijad suhtuvad mõnikord mõtlematult oma teekide ja rakenduste turvalisusesse. Seda lähenemisviisi võib leida kõigist raamatukogudest, millest teie rakendus sõltub.

    Curl_setopt(CURLOPT_SSL_VERIFYPEER, vale);
    Serveri kinnitamise keelamine SSL-kontekstis või curl_setopt() kasutamisel põhjustab haavatavuse vahemees-rünnakute suhtes. Kuid see lülitatakse välja just tüütute vigade probleemi lahendamiseks, mis viitavad rünnakule või rakenduse katsetele võtta ühendust hostiga, mille SSL-sertifikaat on valesti konfigureeritud või aegunud.

    Veebirakendused võivad sageli toimida kasutaja toimingute puhverserverina, näiteks Twitteri klient. Ja vähim, mida saame teha, on hoida oma rakendused kõrgete standardite järgi, mille on seadnud brauserid, mis hoiatavad kasutajaid ja püüavad kaitsta neid kahtlaste serveritega ühenduse loomise eest.

    Järeldused Meil ​​on sageli head võimalused turvalise rakenduse loomiseks. Kuid me ise eirame mõningaid mõistlikke piiranguid, et hõlbustada arendust, silumist ja keelata tüütute vigade väljund. Või üritame headest kavatsustest rakenduse loogikat asjatult keeruliseks ajada.

    Kuid ka häkkerid ei söö oma leiba asjata. Nad otsivad uusi viise, kuidas mööda hiilida meie ebatäiuslikust kaitsemehhanismist ja uurida meie kasutatavate moodulite ja teekide haavatavusi. Ja kui meie ülesanne on luua turvaline veebirakendus, siis nende ülesanne on ohustada meie teenuseid ja andmeid. Lõppkokkuvõttes töötame kõik oma toodete täiustamise nimel.

    Kas teil on vaja kindlaks määrata parim aeg rasestumiseks, ennetada soovimatut rasedust või teada, millal on parim aeg oma partneriga seksida? Kui varem pidid naised selleks oma arsti juurde konsultatsioonile minema, siis nüüd on neil uus parim sõber - nutitelefon.

    Viimastel aastatel on ilmunud palju naistele mõeldud rakendusi, mis võimaldavad hõlpsalt jälgida oma viljakaid päevi ja ovulatsiooni aega, samuti teha isiklikke märkmeid. Lisaks on neil palju muid funktsioone. Üks selline rakendus on Glow, mida kasutab juba 47 miljonit naist. Glow võimaldab teil jälgida selliseid asju nagu naiste meeleolu ning seksi kvaliteet ja sagedus. Tänu sellele rakendusele oli võimalik saada neid huvitavaid fakte naiste intiimse elu kohta kogu maailmast.

    Naiste parimad riigid

    1. Kas sul puudub intiimsus? Mine Kanadasse. Selgub, et kanadalased seksivad 45% sagedamini kui keskmised rakenduse kasutajad.

    2. Kuid ole ettevaatlik: Kanada on suurepärane koht rasestumiseks. Kanada naised võivad rasestuda 21% kergemini kui teised naised.

    3. Austraalia naised seksivad ka sageli – 37% rohkem kui keskmised rakenduse kasutajad.

    4. Ütlematagi selge, et Austraalia naistel on samuti hea võimalus rasestuda? Need on 14% kõrgemad kui teistel kasutajatel.

    5. USA on hea koht õnnelikuks olemiseks. Ameerika naised seksivad 16% tõenäolisemalt kui teised naised.

    6. Halvim koht õnnelikuks olemiseks? Ladina-Ameerika. Siin seksivad naised 4% harvemini kui keskmised rakenduse kasutajad.

    seksuaalsed isud

    1. Naise seksuaalne isu vastab tema igakuisele tsüklile. Tsükli esimest päeva peetakse menstruatsiooni esimeseks päevaks, mis kestab ligikaudu viis päeva. Seega on naised seksist kõige vähem huvitatud ühel kuni viiel päeval kuus.

    2. Paljud naised teatavad selle aja jooksul energiataseme või tuju muutumisest ja see on tavaliselt seotud seksiisu vähenemisega. Samuti tunnevad naised seksist vähem huvi terve nädala jooksul pärast menstruatsiooni.

    3. Enamik naisi alustab uuesti seksiga oma tsükli 12. päeval.

    4. Paljudel naistel on regulaarsed seksuaalsuhted tsükli 12. kuni 14. päevani. Rakendus Glow nimetab neid päevi "seksuaalsuse tipptasemeks".

    5. Tegelikult tunnevad naised end kõige seksuaalsemalt oma tsükli 13. ja 14. päeval. Kuid siin on huvitav: nad ei pruugi sel ajal saada parimat ja kõige rahuldustpakkuvamat seksi.

    6. Üle kõige naudivad naised seksi oma tsükli viimasel, 30. päeval. See päev Glow's on sildistatud "peak orgasmid".

    Kas naised on rahul?

    1. Naised tunnevad end kõige õnnelikumana oma tsükli 15. ja 16. päeval ning ka siis, kui on eelnevatel päevadel palju seksinud.

    2. Glow kasutajad registreerisid kahe aasta jooksul 7,6 miljonit seksuaalkontakti.

    3. See tähendab, et iga minut seksib vähemalt seitse Glow äppi kasutavat naist.

    4. Muide, kasutajad teatasid ka 2 miljonit korda, et on armunud. Rakendus jälgib ka 88 000 paari seksitsükleid ja viljakust.

    5. Vaatamata olemasolevatele seksuaalkontaktidele ei ole kahjuks kõik naised nendega rahul. Peaaegu kolmandik naistest on valmis loobuma pigem seksist kui nutitelefonist.

    6. Aga see tähendab ikkagi, et kaks kolmandikku loobuks pigem telefonidest kui seksist.

    Liituge aruteluga
    Loe ka
    Laadige alla laste esitlus kosmose kohta
    Ettekanne teemal
    Lõbusaid fakte seksi kohta, mida keegi pole sulle varem rääkinud