• Cijeli kraj je jednostavna 4 slova. Zabavne činjenice o seksu koje vam niko prije nije rekao. Nikada ne pokušavajte ispraviti unos

    17.07.2023

    Zdravo. Moje ime je Sasha Barannik. U Mail.Ru Grupi upravljam odjelom za web razvoj koji se sastoji od 15 zaposlenih. Naučili smo kako da kreiramo sajtove za desetine miliona korisnika i lako se nosimo sa nekoliko miliona dnevne publike. I sam se bavim web razvojem oko 20 godina, a zadnjih 15 godina rada programiranje je pretežno u PHP-u. Iako su se mogućnosti jezika i pristup razvoju dosta promijenili tokom ovog vremena, razumijevanje glavnih ranjivosti i sposobnost zaštite od njih ostaju ključne vještine za svakog programera.

    Postoji mnogo članaka i vodiča o sigurnosti na Internetu. Ova knjiga mi se učinila prilično detaljnom, ali sažetom i razumljivom. Nadam se da će vam pomoći da naučite nešto novo i da vaše web stranice učinite sigurnijim i pouzdanijim.

    P.S. Knjiga je duga, pa će prijevod biti izložen u nekoliko članaka. Pa da počnemo...

    Još jedna knjiga o PHP sigurnosti? Postoji mnogo načina za pokretanje PHP sigurnosne knjige. Nažalost, nisam pročitao nijednu, pa ću morati da se pozabavim time u procesu pisanja. Možda ću početi s najosnovnijim i nadam se da će sve uspjeti.

    Ako uzmemo u obzir apstraktnu web aplikaciju koju je online pokrenula kompanija X, možemo pretpostaviti da sadrži niz komponenti koje, ako su hakirane, mogu uzrokovati značajnu štetu. Šta, na primjer?

  • Šteta za korisnike: Dobijanje pristupa e-pošti, lozinkama, ličnim podacima, detaljima bankovnih kartica, poslovnim tajnama, listama kontakata, istoriji transakcija i duboko čuvanim tajnama (kao što je neko svom psu dao ime Glitter). Curenje ovih podataka šteti korisnicima (pojedinci i kompanije). Web aplikacije koje zloupotrebljavaju takve podatke i web stranice koje iskorištavaju povjerenje korisnika također mogu uzrokovati štetu.
  • Šteta samoj kompaniji X: Oštećenje korisnika rezultira oštećenjem reputacije, kompenzacijom, gubitkom kritičnih poslovnih informacija, dodatnim troškovima kao što su infrastruktura, sigurnosna poboljšanja, sanacija, pravni troškovi, velike koristi za odlazak top menadžera, itd.
  • Fokusiraću se na ove dvije kategorije jer one uključuju većinu smetnji koje bi sigurnost web aplikacija trebala spriječiti. Sve kompanije koje su naišle na ozbiljne povrede sigurnosti brzo pišu u saopštenjima za javnost i na web stranicama kako se dive tome. Zato vam savjetujem da unaprijed svim srcem osjetite važnost ovog problema prije nego što se s njim suočite u praksi.

    Nažalost, sigurnosni problemi se često rješavaju naknadno. Smatra se da je najvažnije kreirati radnu aplikaciju koja zadovoljava potrebe korisnika, sa prihvatljivim budžetom i vremenskim okvirom. To je razumljiv skup prioriteta, ali ne možete zauvijek zanemariti sigurnost. Mnogo je bolje imati to na umu u svakom trenutku tako što ćete implementirati specifične odluke tokom razvoja kada je cijena promjene niska.

    Sekundarna sigurnost je u velikoj mjeri rezultat kulture programiranja. Neki programeri oblijeju hladan znoj pri pomisli na ranjivost, dok drugi mogu osporiti postojanje ranjivosti dok ne dokažu da to uopće nije ranjivost. Između ove dvije krajnosti, postoji mnogo programera koji će jednostavno slegnuti ramenima, jer još uvijek nisu pogriješili. Teško im je da shvate ovaj čudan svijet.

    Budući da sigurnosni sistem web aplikacije mora štititi korisnike koji vjeruju servisima aplikacije, potrebno je znati odgovore na pitanja:

  • Ko želi da nas napadne?
  • Kako nas mogu napasti?
  • Kako ih možemo zaustaviti?
  • Ko želi da nas napadne? Odgovor na prvo pitanje je vrlo jednostavan: sve i svašta. Da, cijeli univerzum želi da te nauči lekciju. Klinac sa overklokovanim računarom koji koristi Kali Linux? Verovatno te je već napao. Sumnjičavog čoveka koji voli da zabija štapove u točkove? Verovatno je već unajmio nekoga da vas napadne. Pouzdani REST API preko kojeg primate podatke svaki sat? Vjerovatno je hakovan prije mjesec dana da bi vam dao zaražene podatke. Čak i ja mogu da te napadnem! Zato nemojte slijepo vjerovati ovoj knjizi. Smatraj me kako lažem. I nađi programera koji će me dovesti do čiste vode i razotkriti moj loš savjet. S druge strane, možda će i tebe hakovati...

    Smisao ove paranoje je da olakša mentalno kategoriziranje svega što je u interakciji s vašom web aplikacijom (korisnik, haker, baza podataka, nepouzdani unos, menadžer, REST API) i zatim svakoj kategoriji dodijelite indeks povjerenja. Očigledno "Hakeru" ne treba vjerovati, ali šta je sa "Bazom podataka"? "Nepouzdani unos" je dobio ime s razlogom, ali da li biste zaista filtrirali post na blogu iz pouzdanog Atom feeda kolege?

    Oni koji se ozbiljno bave hakiranjem web aplikacija uče da iskoriste prednosti ovog načina razmišljanja tako što češće napadaju ne ranjive izvore podataka, već pouzdane izvore podataka za koje je manje vjerovatno da će imati dobar sistem zaštite. Ovo nije slučajna odluka: u stvarnom životu subjekti s višim indeksom povjerenja izazivaju manje sumnje. Upravo na te izvore podataka prvenstveno obraćam pažnju kada analiziram aplikaciju.

    Vratimo se bazama podataka. Pod pretpostavkom da haker može pristupiti bazi podataka (a mi paranoici uvijek pretpostavljamo), onda joj se nikada ne može vjerovati. Većina aplikacija vjeruje bazama podataka bez sumnje. Izvana, web aplikacija izgleda kao jedinstvena cjelina, ali unutar nje je sistem odvojenih komponenti koje razmjenjuju podatke. Ako smatramo da su sve ove komponente pouzdane, onda ako je jedna od njih hakovana, sve ostale će brzo biti ugrožene. Ovakvi katastrofalni sigurnosni problemi ne mogu se riješiti frazom "Ako je baza hakovana, onda smo ipak izgubili". Možete tako reći, ali uopće nije činjenica da ćete to morati učiniti ako u početku ne vjerujete bazi i postupite u skladu s tim!

    Kako nas mogu napasti? Odgovor na drugo pitanje je prilično opsežna lista. Možete biti napadnuti s bilo kojeg mjesta gdje svaka komponenta ili sloj web aplikacije dobija svoje podatke. U suštini, web aplikacije jednostavno obrađuju podatke i premještaju ih s mjesta na mjesto. Korisnički upiti, baze podataka, API-ji, blog feedovi, obrasci, kolačići, spremišta, varijable PHP okruženja, konfiguracijski fajlovi, opet konfiguracijski fajlovi, čak i PHP datoteke koje izvršavate - sve to može potencijalno biti zaraženo podacima o kršenju sigurnosti i oštećenjima. U stvari, ako zlonamjerni podaci nisu eksplicitno prisutni u PHP kodu koji se koristi za zahtjev, onda će vjerovatno doći kao "korisno opterećenje". Ovo pretpostavlja da a) ste napisali PHP izvorni kod, b) da je propisno pregledan i c) da vas kriminalne organizacije nisu platile.

    Ako koristite izvore podataka bez provjere da li su podaci potpuno sigurni i pogodni za upotrebu, tada ste potencijalno otvoreni za napad. Također morate provjeriti da li primljeni podaci odgovaraju podacima koje šaljete. Ako podaci nisu potpuno sigurni za povlačenje, tada ćete imati i ozbiljne probleme. Sve ovo se može izraziti kao pravilo za PHP “Validate input; izbjeći izlaz."

    Ovo su očigledni izvori podataka koje moramo nekako kontrolirati. Izvori također mogu uključivati ​​spremišta na strani klijenta. Na primjer, većina aplikacija prepoznaje korisnike tako što im dodjeljuje jedinstvene ID-ove sesije, koji se mogu pohraniti u kolačiće. Ako napadač dobije vrijednost iz kolačića, tada se može lažno predstavljati kao drugi korisnik. Iako možemo ublažiti neke od rizika povezanih sa presretanjem ili neovlaštenim pristupom korisničkim podacima, ne možemo garantirati fizičku sigurnost korisničkog računala. Ne možemo čak ni garantovati da će korisnici pronaći "123456" najgluplju lozinku nakon "lozinke". Dodatak začin je činjenica da danas kolačići nisu jedina vrsta pohrane na strani korisnika.

    Još jedan rizik koji se često zanemaruje odnosi se na integritet vašeg izvornog koda. U PHP-u postaje sve popularnije razvijati aplikacije zasnovane na velikom broju labavo povezanih biblioteka, modula i paketa za okvire. Mnogi od njih se preuzimaju iz javnih spremišta kao što je Github, instalirani su pomoću instalatora paketa poput Composer i njegovog web pratioca Packagist.org. Stoga, sigurnost izvornog koda u potpunosti ovisi o sigurnosti svih ovih usluga i komponenti trećih strana. Ako je Github kompromitovan, najvjerovatnije će se koristiti za distribuciju koda sa zlonamjernim dodatkom. Ako Packagist.org - tada će napadač moći preusmjeriti zahtjeve za pakete na svoje, zlonamjerne pakete.

    Trenutno, Composer i Packagist.org su pogođeni poznatim ranjivostima u otkrivanju zavisnosti i distribuciji paketa, tako da uvijek provjerite sve u svom proizvodnom okruženju i provjerite izvor svih paketa sa Packagist.org.

    Kako ih možemo zaustaviti? Probijanje sigurnosti web aplikacije može biti smiješno jednostavno i dugotrajno. Pošteno je pretpostaviti da svaka web aplikacija negdje ima ranjivost. Razlog je jednostavan: sve aplikacije prave ljudi, a ljudi prave greške. Dakle, savršena sigurnost je pravi san. Sve aplikacije mogu sadržati ranjivosti, a zadatak programera je da minimiziraju rizike.

    Morat ćete dobro razmisliti kako biste smanjili vjerojatnost štete od napada na web aplikaciju. U toku priče govoriću o mogućim metodama napada. Neki od njih su očigledni, drugi nisu. Ali u svakom slučaju, da bi se problem riješio, potrebno je uzeti u obzir neke osnovne sigurnosne principe.

    Osnovni principi sigurnosti Prilikom dizajniranja sigurnosnih mjera, njihova učinkovitost se može ocijeniti korištenjem sljedećih razmatranja. Neke sam već spomenuo gore.
  • Ne vjerujte nikome i ničemu.
  • Uvijek pretpostavite najgori scenario.
  • Primijenite zaštitu na više nivoa (Defence-in-Depth).
  • Pridržavajte se principa "što jednostavnije to bolje" (Keep It Simple Stupid, KISS).
  • Pridržavajte se principa "najmanje privilegija".
  • Napadači namirišu dvosmislenost.
  • Pročitajte dokumentaciju (RTFM), ali joj nemojte vjerovati.
  • Ako nije testirano, onda ne radi.
  • Uvijek si ti kriv!
  • Hajdemo ukratko preko svih tačaka.1. Ne vjerujte nikome ili bilo čemu Kao što je gore spomenuto, ispravan stav je pretpostaviti da svako i sve sa čim vaša web aplikacija komunicira želi da je hakuje. Ovo uključuje druge komponente aplikacije ili slojeve koji su potrebni za obradu zahtjeva. Sve i sve. Bez izuzetaka.2. Uvijek pretpostavite najgori slučaj Mnogi sigurnosni sistemi imaju jednu zajedničku stvar: bez obzira na to koliko su dobro napravljeni, svi mogu biti probijeni. Ako ovo uzmete u obzir, brzo ćete shvatiti prednost druge tačke. Fokusiranje na najgori scenario pomoći će u procjeni obima i ozbiljnosti napada. A ako se to ipak dogodi, onda ćete možda moći smanjiti neugodne posljedice kroz dodatne zaštite i promjene u arhitekturi. Možda je tradicionalno rješenje koje koristite već zamijenjeno nečim boljim?3. Upotreba dubinske odbrane Dubinska odbrana je pozajmljena iz vojne nauke jer su ljudi odavno shvatili da je više zidova, vreća s pijeskom, vozila, pancira i boca koje pokrivaju vitalne organe od neprijateljskih metaka i oštrica pravi pristup sigurnosti. Nikada ne znate šta od gore navedenog neće zaštititi, a morate biti sigurni da vam nekoliko nivoa zaštite omogućava da se oslonite na više od jednog utvrđenja ili borbene formacije. Naravno, ne radi se samo o pojedinačnim neuspjesima. Zamislite napadača kako se penje na džinovski srednjovjekovni zid koristeći ljestve i otkriva da se iza njega nalazi još jedan zid, odakle ih zasipaju strijele. Hakeri će se osjećati na isti način.4. Keep It Simple Stupid (KISS) Najbolja odbrana je uvijek jednostavna. Lako ih je razviti, implementirati, razumjeti, koristiti i testirati. Jednostavnost smanjuje greške, podstiče ispravne performanse aplikacije i olakšava implementaciju čak i u najsloženijim i najneprijateljskim okruženjima.5. Pridržavati se principa „najmanje privilegija“ Svaki učesnik u razmjeni informacija (korisnik, proces, program) treba da ima samo ona prava pristupa koja su mu potrebna za obavljanje svojih funkcija.6. Napadači namirišu opskurnost "Sigurnost kroz opskurnost" se zasniva na pretpostavci da ako koristite zaštitu A i nikome ne kažete šta je, kako funkcioniše ili uopšte postoji, onda vam ona magično pomaže, jer su napadači zbunjeni. Zapravo, ovo daje samo malu prednost. Često, vješt napadač može shvatiti šta ste uradili, tako da morate koristiti i eksplicitnu odbranu. Oni koji su neopravdano uvjereni da nejasna odbrana eliminira potrebu za stvarnom, trebaju biti posebno kažnjeni radi oslobađanja od iluzija.7. Pročitajte dokumentaciju (RTFM), ali joj nemojte vjerovati. PHP priručnik je biblija. Naravno, nije ga napisalo Leteće špageti čudovište, pa tehnički može sadržavati niz poluistina, propusta, pogrešnih tumačenja ili grešaka koje još nisu uočene ili ispravljene. Isto važi i za Stack Overflow.

    Specijalizovani izvori bezbednosne mudrosti (fokusirani na PHP i šire) pružaju detaljnije znanje uopšte. Najbliža stvar PHP sigurnosnoj bibliji je OWASP, sa člancima, tutorijalima i savjetima. Ako je nešto obeshrabreno na OWASP-u, nikada to ne radite!

    8. Ako nije testirano, ne radi Prilikom implementacije zaštite, morate napisati sve potrebne testove kako biste potvrdili da rade. Uključujući pretvaranje da ste haker za kojim zatvor plače. Možda se čini nategnutim, ali poznavanje tehnika hakovanja web aplikacija je dobra praksa; naučit ćete o mogućim ranjivostima, a vaša paranoja će se povećati. Istovremeno, nije potrebno reći menadžmentu o novostečenoj zahvalnosti za hakovanje web aplikacije. Obavezno koristite automatizirane alate za identifikaciju ranjivosti. Oni su korisni, ali naravno ne zamjenjuju kvalitetne preglede koda, pa čak ni ručno testiranje aplikacije. Što više resursa potrošite na testiranje, to će vaša aplikacija biti pouzdanija.9. Uvijek si ti kriv! Programeri su navikli da vjeruju da će se sigurnosne ranjivosti pronaći kao raštrkani napadi, a njihove posljedice su beznačajne.

    Na primjer, kršenje podataka (dobro dokumentirana i rasprostranjena vrsta hakovanja) često se smatra malim sigurnosnim problemima jer ne utječu direktno na korisnike. Međutim, curenje informacija o verzijama softvera, razvojnim jezicima, lokacijama izvornog koda, logici aplikacije i poslovnoj logici, strukturi baze podataka i drugim aspektima okruženja web aplikacije i internih operacija često je ključno za uspješan napad.

    Istovremeno, napadi na sigurnosne sisteme često su kombinacije napada. Pojedinačno su beznačajni, ali u isto vrijeme ponekad otvaraju put za druge napade. Na primjer, SQL injekcija ponekad zahtijeva određeno korisničko ime, koje se može dobiti korištenjem Timing Attack-a na administrativni interfejs, umjesto mnogo skuplje i primjetnije grube sile. Zauzvrat, SQL injekcija vam omogućava da implementirate XSS napad na određeni administrativni nalog bez privlačenja pažnje na veliki broj sumnjivih unosa u dnevnik.

    Opasnost posmatranja ranjivosti izolovano leži u potcjenjivanju njihove prijetnje i, stoga, u previše nemarnom postupanju prema njima. Programeri su često previše lijeni da poprave ranjivost jer je smatraju previše manjom. Takođe se praktikuje prebacivanje odgovornosti za siguran razvoj na krajnje programere ili korisnike, a često i bez dokumentovanja konkretnih problema: čak se i postojanje ovih ranjivosti ne prepoznaje.

    Prividna beznačajnost nije važna. Neodgovorno je prisiljavati programere ili korisnike da poprave vaše propuste, pogotovo ako niste ni obavijestili o njima.

    Provjera valjanosti unosa Validacija unosa je vanjski odbrambeni perimetar vaše web aplikacije. Štiti osnovnu poslovnu logiku, obradu podataka i generiranje izlaza. U doslovnom smislu, sve izvan ovog perimetra, izuzev koda koji se izvršava trenutnim zahtjevom, smatra se neprijateljskom teritorijom. Sve moguće ulaze i izlaze iz perimetra danonoćno čuvaju ratoborni stražari koji prvi pucaju, a kasnije postavljaju pitanja. Povezani sa perimetrom su odvojeno čuvani (i vrlo sumnjivog izgleda) "saveznici", uključujući "Model", "Bazu podataka" i "Sistem datoteka". Niko ih ne želi upucati, ali ako okušaju sreću... bang. Svaki saveznik ima svoj perimetar, koji može, ali ne mora vjerovati našem.

    Sjećate se mojih riječi o tome kome možete vjerovati? Niko i ništa. U svijetu PHP-a svuda je savjet da se ne vjeruje "korisničkom unosu". Ovo je jedna od kategorija prema stepenu povjerenja. Pod pretpostavkom da se korisnicima ne može vjerovati, mislimo da se svemu ostalom može vjerovati. Ovo je pogrešno. Korisnici su najočigledniji nepouzdan izvor inputa jer ih ne poznajemo i ne možemo kontrolirati.

    Kriteriji validacije Validacija unosa je i najočitija i najnepouzdanija odbrana web aplikacije. Velika većina ranjivosti nastaje zbog kvarova u sistemu verifikacije, pa je veoma važno da ovaj dio zaštite radi ispravno. Može propasti, ali se ipak pridržavajte sljedećih razmatranja. Uvijek imajte na umu kada implementirate prilagođene validatore i koristite biblioteke za provjeru valjanosti treće strane da rješenja trećih strana imaju tendenciju da izvode uobičajene zadatke i izostavite ključne rutine validacije koje bi vašoj aplikaciji mogle biti potrebne. Kada koristite bilo koju biblioteku dizajniranu za sigurnosne potrebe, obavezno ih sami provjerite ima li ranjivosti i ispravnog rada. Takođe preporučujem da ne zaboravite da PHP može pokazati čudno i možda nesigurno ponašanje. Pogledajte ovaj primjer, preuzet iz funkcija filtera:

    Filter_var("php://example.org", FILTER_VALIDATE_URL);
    Filter radi bez problema. Problem je u tome što prihvaćeni php:// URL može biti proslijeđen PHP funkciji koja očekuje da primi udaljenu HTTP adresu, umjesto da vraća podatke iz izvršne PHP skripte (preko PHP rukovaoca). Ranjivost se javlja jer opcija filtera nema metodu koja ograničava dozvoljene URI-je. Iako aplikacija očekuje http, https ili mailto vezu, a ne neki URI specifičan za PHP. Neophodno je svim sredstvima izbjeći takav preopšti pristup verifikaciji.

    Budite oprezni s kontekstom Provjera valjanosti unosa bi vas trebala spriječiti da unesete nesigurne podatke u vašu web aplikaciju. Glavni kamen spoticanja: Sigurnosne provjere podataka se obično izvode samo za prvu namjeravanu upotrebu.

    Recimo da sam primio podatke koji sadrže ime. Lako mogu provjeriti ima li apostrofa, crtica, zagrada, razmaka i čitav niz alfanumeričkih Unicode znakova. Naziv je važeći podatak koji se može koristiti za prikaz (prva namjeravana upotreba). Ali ako ga koristite negdje drugdje (na primjer, u upitu baze podataka), tada će biti u novom kontekstu. I neki od znakova koji su dozvoljeni u imenu bit će opasni u ovom kontekstu: ako se ime konvertuje u niz za izvođenje SQL injekcije.

    Ispostavilo se da je validacija unosa sama po sebi nepouzdana. Najefikasniji je za skraćivanje nedvosmisleno nevažećih vrijednosti. Recite kada nešto treba da bude cijeli broj, alfanumerički niz ili HTTP URL. Takvi formati i vrijednosti imaju svoja ograničenja i, ako su pravilno provjereni, manje je vjerojatno da će predstavljati prijetnju. Druge vrijednosti (neograničen tekst, GET/POST nizovi i HTML) je teže provjeriti i vjerojatnije je da sadrže zlonamjerne podatke.

    Budući da će većinu vremena naša aplikacija prosljeđivati ​​podatke između konteksta, ne možemo samo provjeriti sve unose i uzeti u obzir obavljeni posao. Prijava je samo prva petlja zaštite, ali nikako i jedina.

    Uz provjeru valjanosti ulaznih podataka, vrlo se često koristi i zaštitna metoda kao što je izbjegavanje. Pomoću njega se provjerava sigurnost podataka prilikom ulaska u svaki novi kontekst. Obično se ova metoda koristi za zaštitu od skriptiranja na više lokacija (XSS), ali je također tražena u mnogim drugim zadacima, kao alat za filtriranje.

    Escapeing štiti od pogrešne interpretacije od strane primaoca odlaznih podataka. Ali to nije dovoljno - kako podaci ulaze u novi kontekst, potrebna je provjera posebno za određeni kontekst.

    Iako se ovo može posmatrati kao dupliranje početne validacije unosa, dodatni koraci validacije su zapravo bolje prilagođeni trenutnom kontekstu kada su zahtevi za podacima veoma različiti. Na primjer, podaci koji dolaze iz obrasca mogu sadržavati postotak. Prvi put kada ga koristimo, provjeravamo da li je vrijednost zaista cijeli broj. Ali kada ga prenesemo na naš model aplikacije, mogu se pojaviti novi zahtjevi: vrijednost mora stati u određeni raspon, koji je obavezan da bi poslovna logika aplikacije funkcionirala. A ako se ova dodatna provjera ne izvrši u novom kontekstu, onda mogu nastati ozbiljni problemi.

    Koristite samo bele liste, a ne crne liste Crne liste i bele liste su dva primarna pristupa validaciji unosa. Crna boja znači provjeru valjanih podataka, a bijela provjeru valjanih podataka. Bijela lista je poželjna jer se tokom validacije prosljeđuju samo podaci koje očekujemo. Zauzvrat, crne liste uzimaju u obzir samo pretpostavke programera o svim mogućim pogrešnim podacima, pa je ovdje mnogo lakše zbuniti se, nešto propustiti ili pogriješiti.

    Dobar primjer je svaka procedura validacije dizajnirana da učini HTML sigurnim sa stanovišta neizvršenog izlaza u šablonu. Ako koristimo crnu listu, onda moramo provjeriti da HTML ne sadrži opasne elemente, atribute, stilove i izvršni JavaScript. Puno je posla, a čistači HTML-a bazirani na crnoj listi uvijek uspijevaju previdjeti opasne kombinacije koda. A alati za stavljanje na bijelu listu eliminišu ovu dvosmislenost dopuštajući samo poznate dozvoljene elemente i atribute. Svi ostali će jednostavno biti odvojeni, izolovani ili uklonjeni, bez obzira na to kakvi su.

    Stoga je stavljanje na bijelu listu poželjnije za sve procedure provjere zbog veće sigurnosti i pouzdanosti.

    Nikada ne pokušavajte da ispravite ulazne podatke. Validacija ulaznih podataka često je praćena filtriranjem. Ako prilikom provjere jednostavno procijenimo ispravnost podataka (uz davanje pozitivnog ili negativnog rezultata), tada filtriranje mijenja podatke koji se provjeravaju tako da zadovoljavaju određena pravila.

    Ovo je obično donekle štetno. Tradicionalni filteri uključuju, na primjer, uklanjanje svih znakova osim brojeva iz telefonskih brojeva (uključujući dodatne zagrade i crtice) ili skraćivanje nepotrebnog horizontalnog ili vertikalnog prostora. U takvim situacijama, minimalno čišćenje se izvodi kako bi se eliminisale greške prikaza ili prijenosa. Međutim, možete se previše zanijeti korištenjem filtriranja za blokiranje zlonamjernih podataka.

    Jedna od posljedica pokušaja popravljanja unosa je da napadač može predvidjeti utjecaj vaših popravki. Recimo da postoji neka nevažeća vrijednost niza. Tražite ga, brišete i završavate filtriranje. Što ako napadač kreira vrijednost razdvojenu nizom da prevari vaš filter?

    upozorenje(document.cookie);
    U ovom primjeru, jednostavno filtriranje po oznaci neće učiniti ništa: uklanjanje eksplicitne oznake će uzrokovati da se podaci tretiraju kao potpuno važeći element HTML skripte. Isto se može reći i za filtriranje prema bilo kojem specifičnom formatu. Sve ovo jasno pokazuje zašto je nemoguće učiniti validaciju ulaznih podataka posljednjom zaštitnom petljom aplikacije.

    Umjesto da pokušavate ispraviti unose, samo koristite validator na bijeloj listi i u potpunosti odbacite takve pokušaje unosa. A tamo gdje trebate filtrirati, uvijek filtrirajte prije provjere, nikad poslije.

    Nikada nemojte vjerovati vanjskim validatorima i stalno pratiti ranjivosti Ranije sam primijetio da je provjera valjanosti potrebna svaki put kada se podaci prenose u novi kontekst. Ovo se također odnosi na validaciju koja se izvodi izvan same web aplikacije. Ove kontrole uključuju provjeru valjanosti ili druga ograničenja primijenjena na HTML obrasce u pretraživaču. Pogledajte ovaj obrazac iz HTML 5 (oznake su izostavljene):

    Rep. Irske Ujedinjeno Kraljevstvo
    HTML obrasci mogu nametnuti ograničenja na ulazne podatke. Odabir možete ograničiti listom fiksnih stavki, postaviti minimalne i maksimalne vrijednosti i ograničiti dužinu teksta. Mogućnosti HTML 5 su još šire. Pretraživači mogu provjeriti URL-ove i mail adrese, kontrolirati datume, brojeve i opsege (iako je podrška za posljednja dva prilično proizvoljna). Pregledači također mogu provjeriti valjanost unosa koristeći JavaScript regularne izraze uključene u atribut šablona.

    Uz svo ovo obilje kontrola, ne smijemo zaboraviti da je njihova svrha poboljšati upotrebljivost vaše aplikacije. Svaki napadač može kreirati obrazac koji ne sadrži ograničenja iz vašeg originalnog obrasca. Možete čak kreirati i HTTP klijenta za automatsko popunjavanje obrazaca!

    Još jedan primjer eksternih validatora je dobijanje podataka od API-ja trećih strana kao što je Twitter. Ova društvena mreža ima dobru reputaciju i obično joj se vjeruje bez sumnje. Ali pošto smo paranoični, ne vjerujte ni Twitteru. Ako budu ugroženi, njegovi odgovori će sadržavati nesigurne podatke, za koje nećemo biti spremni. Stoga, čak i ovdje, primijenite vlastitu provjeru kako ne biste bili bespomoćni u slučaju nečega.

    Tamo gdje imamo povjerenja u eksterna sredstva provjere, zgodno je pratiti ranjivosti. Na primjer, ako HTML obrazac postavlja ograničenje maksimalne dužine i primamo ulazne podatke čija je veličina dostigla ograničenje, onda je logično pretpostaviti da ovaj korisnik pokušava zaobići provjeru valjanosti. Na taj način možemo registrirati nedostatke u vanjskim alatima i poduzeti dalje mjere protiv potencijalnih napada ograničavanjem pristupa ili broja zahtjeva.

    Izbjegavajte konverzije tipova u PHP-u PHP nije jezik sa jakom tipizacijom, a većina njegovih funkcija i operacija je bezbedna za tipove. To može dovesti do ozbiljnih problema. Štaviše, nisu same vrijednosti posebno ranjive, već validatori. Na primjer:

    Potvrditi(0 == "0ABC"); //vraća TRUE assert(0 == "ABC"); //vraća TRUE (čak i bez vodeće cifre!) assert(0 === "0ABC"); //vraća NULL/Daje upozorenje da se tvrdnja ne može provjeriti
    Kada dizajnirate validatore, vodite računa da koristite strogo poređenje i ručnu konverziju tipa kada ulazne ili izlazne vrijednosti mogu biti niz. Na primjer, obrasci mogu vratiti niz, pa ako radite s podacima koji moraju biti cijeli broj, provjerite njihov tip:

    Funkcija checkIntegerRange($int, $min, $max) ( if (is_string($int) && !ctype_digit($int)) ( return false; // sadrži nenumeričke znakove ) if (!is_int((int) $int)) ( return false; // druga necjelobrojna vrijednost ili veća PHP_MAX_INT >= return $int_pe & $int >= return $minpe & $int >= er" => TRUE))); $body = file_get_contents("https://api.example.com/search?q=sphinx", false, $context);
    UPD. U PHP 5.6+, opcija ssl.verify_peer je po defaultu postavljena na TRUE.

    Ekstenzija cURL uključuje validaciju servera iz kutije, tako da ne morate ništa da konfigurišete. Međutim, programeri ponekad imaju nepromišljen pristup sigurnosti svojih biblioteka i aplikacija. Ovaj pristup se može naći u svim bibliotekama o kojima će ovisiti vaša aplikacija.

    Curl_setopt(CURLOPT_SSL_VERIFYPEER, netačno);
    Onemogućavanje verifikacije servera u SSL kontekstu ili kada se koristi curl_setopt() će dovesti do ranjivosti na napade čoveka u sredini. Ali isključen je upravo da bi se riješio problem dosadnih grešaka koje ukazuju na napad ili pokušaje aplikacije da kontaktira host čiji je SSL certifikat pogrešno konfiguriran ili istekao.

    Web aplikacije često mogu djelovati kao proxy za radnje korisnika, kao što je Twitter klijent. I najmanje što možemo učiniti je da naše aplikacije ispunjavaju visoke standarde koje postavljaju pretraživači koji upozoravaju korisnike i pokušavaju ih zaštititi od povezivanja na sumnjive servere.

    Zaključci Često smo u dobroj poziciji da kreiramo sigurnu aplikaciju. Ali mi sami zaobilazimo neka razumna ograničenja kako bismo olakšali razvoj, otklanjanje grešaka i onemogućili izlaz dosadnih grešaka. Ili, iz dobrih namjera, pokušavamo nepotrebno zakomplikovati logiku aplikacije.

    Ali ni hakeri ne jedu svoj hleb uzalud. Oni traže nove načine da zaobiđu našu nesavršenu odbranu i proučavaju ranjivosti u modulima i bibliotekama koje koristimo. A ako je naš zadatak da kreiramo sigurnu web aplikaciju, onda je njihov zadatak da kompromituju naše usluge i podatke. Na kraju krajeva, svi radimo na poboljšanju naših proizvoda.

    Trebate li odrediti najbolje vrijeme za začeće, spriječiti neželjenu trudnoću ili znati kada je najbolje vrijeme za seks sa svojim partnerom? Ranije su za to žene morale ići na konsultacije sa svojim doktorom, ali sada imaju novog najboljeg prijatelja - pametni telefon.

    Posljednjih godina pojavile su se mnoge aplikacije za žene koje vam omogućavaju da lako pratite svoje plodne dane i vrijeme ovulacije, kao i da pravite lične bilješke. Osim toga, imaju i mnoge druge funkcije. Jedna takva aplikacija je Glow, koju već koristi 47 miliona žena. Glow vam omogućava da pratite stvari poput raspoloženja žena i kvaliteta i učestalosti seksa. Zahvaljujući ovoj aplikaciji postalo je moguće doći do ovih zanimljivih činjenica o intimnom životu žena iz cijelog svijeta.

    Najbolje zemlje za žene

    1. Nedostaje li vam intimnosti? Idi u Kanadu. Ispostavilo se da Kanađani imaju seks 45% češće od prosječnih korisnika aplikacije.

    2. Ali pazite: Kanada je odlično mjesto za trudnoću. Kanađanke mogu zatrudnjeti 21% lakše nego druge žene.

    3. Australke također često imaju seks - 37% više od prosječnih korisnika aplikacije.

    4. Nepotrebno je reći da žene u Australiji također imaju dobre šanse da zatrudne? Oni su 14% veći od ostalih korisnika.

    5. SAD je dobro mesto za sreću. Amerikanke imaju 16% veću vjerovatnoću da će imati seks nego druge žene.

    6. Najgore mesto za sreću? Latinska amerika. Ovdje žene imaju seks 4% rjeđe od prosječnih korisnika aplikacije.

    seksualni apetiti

    1. Seksualni apetit žene odgovara njenom mjesečnom ciklusu. Prvi dan ciklusa smatra se prvim danom menstruacije, koja traje otprilike pet dana. Tako su žene najmanje zainteresovane za seks između jednog i pet dana u mesecu.

    2. Mnoge žene prijavljuju promjenu nivoa energije ili raspoloženja tokom ovog perioda, a to je obično povezano sa smanjenjem seksualnog nagona. Takođe, žene su manje zainteresovane za seks čitavu nedelju nakon menstruacije.

    3. Većina žena ponovo započne seks 12. dana ciklusa.

    4. Mnoge žene imaju redovne seksualne odnose od 12. do 14. dana ciklusa. Aplikacija Glow ovih dana naziva "vrhunac seksualnosti".

    5. Zapravo, žene se najseksualnije osjećaju 13. i 14. dana ciklusa. Ali evo što je zanimljivo: oni ne moraju nužno dobiti najbolji i najzadovoljniji seks u ovom trenutku.

    6. Najviše od svega, žene uživaju u seksu poslednjeg, 30. dana ciklusa. Ovaj dan u sjaju je označen kao "vrhunac orgazama".

    Da li su žene zadovoljne?

    1. Žene se osjećaju najsrećnije 15. i 16. dana ciklusa, a takođe i kada su imale mnogo seksa prethodnih dana.

    2. Korisnici Glowa su za dvije godine zabilježili 7,6 miliona seksualnih kontakata.

    3. To znači da svake minute najmanje sedam žena koje koriste aplikaciju Glow imaju seks.

    4. Inače, korisnici su takođe prijavili da su zaljubljeni 2 miliona puta. Aplikacija također prati seksualne cikluse i plodnost 88.000 parova.

    5. Nažalost, uprkos postojećim seksualnim kontaktima, nisu sve žene njima zadovoljne. Gotovo trećina žena je spremna da se odrekne seksa radije nego pametnog telefona.

    6. Ali to i dalje znači da bi se dvije trećine radije odrekle telefona nego seksa.

    Slični članci