Greitas įvadas į interneto saugumą

Žiniatinklio kūrėjo pradmenys apie CORS, CSP, HSTS ir visus žiniatinklio saugumo akronimus!

Yra daugybė priežasčių sužinoti apie žiniatinklio saugumą, pavyzdžiui:

  • Esate susirūpinęs vartotojas, kuris jaudinasi dėl jūsų asmeninių duomenų nutekėjimo
  • Esate susirūpinęs žiniatinklio kūrėjas, norintis padaryti savo žiniatinklio programas saugesnes
  • Esate žiniatinklio kūrėjas, besikreipiantis į darbus, ir norite būti pasirengęs, jei jūsų pašnekovai jums užduos klausimus apie interneto saugumą

ir taip toliau.

Na, šis įrašas paaiškins kai kuriuos įprastus žiniatinklio saugumo akronimus taip, kad juos būtų lengva suprasti, bet vis tiek tiksliai.

Prieš tai atlikdami įsitikinkime, kad suprantame keletą pagrindinių saugumo sampratų.

Dvi pagrindinės saugumo sampratos

Niekas niekada nėra 100% saugus.

Nėra idėjos būti 100% apsaugotam nuo įsilaužimo. Jei kas nors jums kada nors tai sako, jis klysta.

Vieno apsaugos sluoksnio nepakanka.

Negalite tiesiog pasakyti ...

O, nes turiu įdiegtą CSP, aš esu saugus. Skirtingų svetainių scenarijus galiu pašalinti iš savo pažeidžiamumų sąrašo, nes tai negali atsitikti dabar.

Gal tai yra duota kai kuriems, bet lengva pastebėti, kad taip mąstai. Manau, kad viena iš priežasčių, kodėl programuotojai gali lengvai atsidurti tokiu būdu, yra ta, kad tiek daug kodavimo būdų yra juoda ir balta, 0 arba 1, tiesa ar melas. Saugumas nėra toks paprastas.

Pradėsime nuo vieno, į kurį visi susiduria gana anksti savo interneto kūrimo kelionėje. Tada žiūrite į „StackOverflow“ ir rasite daugybę atsakymų, nurodančių, kaip jį apeiti.

Kryžminis šaltinių bendrinimas (CORS)

Ar kada nors gavote klaidą, kuri atrodė maždaug taip?

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

Jūs tikrai ne vienas. Tada jūs jį „Google“ ir kažkas liepia jums įsigyti šį plėtinį, kuris privers visas jūsų problemas!

Puiku, tiesa?

CORS yra tam, kad jus apsaugotų, o ne įskaudintų!

Norėdami paaiškinti, kaip CORS jums padeda, pirmiausia pakalbėkime apie slapukus, ypač apie autentifikavimo slapukus . Autentifikavimo slapukai naudojami pranešti serveriui, kad esate prisijungę, ir jie automatiškai siunčiami su bet kokia jūsų tam serverui pateikiama užklausa.

Tarkime, kad esate prisijungę prie „Facebook“, ir jie naudoja autentifikavimo slapukus. Spustelite, bit.ly/r43nugikuri peradresuoja superevilwebsite.rocks. Viduje esantis scenarijus superevilwebsite.rockspateikia kliento užklausą, į facebook.comkurią siunčiamas jūsų autentifikavimo slapukas!

Pasaulyje be CORS jie gali atlikti pakeitimus jūsų paskyroje, net nežinodami. Kol, žinoma, jie nepaskelbia bit.ly/r43nugijūsų laiko juostos, o visi jūsų draugai ją paspaudžia, tada jie paskelbia bit.ly/r43nugivisus jūsų draugų laiko grafikus, o tada ciklas tęsiasi pagal blogio pirmumo schemą, kuri užkariauja visus „Facebook“ vartotojus. ir pasaulį sunaudoja superevilwebsite.rocks. ?

Tačiau CORS pasaulyje „Facebook“ leido tik prašymams, kurių kilmė yra facebook.com, redaguoti duomenis savo serveryje. Kitaip tariant, jie apribotų skirtingų kilmės išteklių dalijimąsi. Tada galite paklausti ...

Ar superevilwebsite.rocks gali tik pakeisti kilmės antraštę pagal jų užklausą, kad atrodytų, jog ji yra iš facebook.com?

Jie gali bandyti, bet tai neveiks, nes naršyklė tiesiog nepaisys to ir naudos tikrąją kilmę.

Gerai, bet ką daryti, jei superevilwebsite.rocks pateikė užklausą serverio pusėje?

Tokiu atveju jie galėtų apeiti CORS, tačiau jie nelaimės, nes negalės pasiųsti jūsų autentifikavimo slapuko. Norėdami gauti prieigą prie kliento pusės slapukų, scenarijų reikės vykdyti kliento pusėje.

Turinio saugumo politika (CSP)

Norėdami suprasti CSP, pirmiausia turime kalbėti apie vieną iš labiausiai paplitusių pažeidžiamumų internete: XSS, kuris reiškia kelių svetainių scenarijus (yay - kitas akronimas).

XSS yra tada, kai koks nors blogas žmogus įveda „JavaScript“ į jūsų kliento kodą. Galima pagalvoti ...

Ką jie darys? Keisti spalvą iš raudonos į mėlyną?

Tarkime, kad kažkas sėkmingai įvedė „JavaScript“ į jūsų lankomos svetainės kliento kodą.

Ką jie galėtų padaryti, kas būtų kenkėjiška?

  • Jie galėtų pateikti HTTP užklausas į kitą svetainę apsimesdami jumis.
  • Jie galėtų pridėti inkaro žymą, nukreipiančią jus į svetainę, kuri atrodo identiška tam, kuriame esate, su šiek tiek kitomis, kenksmingomis savybėmis.
  • Jie galėjo pridėti scenarijaus žymą su tiesiogine „JavaScript“.
  • Jie galėjo pridėti scenarijaus žymą, kuri kažkur atneša nuotolinį „JavaScript“ failą.
  • Jie gali pridėti „iframe“, apimantį puslapį ir atrodantį kaip svetainės dalis, raginantį įvesti slaptažodį.

Galimybės yra begalinės.

Sertifikavimo paslaugų teikėjas bando užkirsti tam kelią, apribodamas

  • ką galima atidaryti „iframe“
  • kokius stiliaus lapus galima įkelti
  • kur galima pateikti prašymus ir kt.

Taigi kaip tai veikia?

Spustelėjus nuorodą arba įvedus svetainės URL naršyklės adreso juostoje, jūsų naršyklė pateikia GET užklausą. Galų gale jis patenka į serverį, kuris aptarnauja HTML ir kai kurias HTTP antraštes. Jei norite sužinoti, kokias antraštes gaunate, konsolėje atidarykite skirtuką Tinklas ir apsilankykite kai kuriose svetainėse.

Galite pamatyti atsakymo antraštę, kuri atrodo taip:

content-security-policy: default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' *.atlassolutions.com blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* //fb.scanandcleanlocal.com:* *.atlassolutions.com attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;

Tai yra facebook.com. Pertvarkykime, kad būtų lengviau skaityti:

content-security-policy: default-src * data: blob:; script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' *.atlassolutions.com blob: data: 'self'; style-src data: blob: 'unsafe-inline' *; connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* //fb.scanandcleanlocal.com:* *.atlassolutions.com attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;

Dabar suskirstykime direktyvas.

  • default-src riboja visas kitas sertifikavimo paslaugų teikėjų direktyvas, kurios nėra aiškiai išvardytos.
  • script-srcapriboja scenarijus, kuriuos galima įkelti.
  • style-src apriboja stilių, kuriuos galima įkelti, lenteles.
  • connect-src riboja URL, kuriuos galima įkelti naudojant scenarijaus sąsajas, taigi „fetch“, „XHR“, „ajax“ ir kt.

Atkreipkite dėmesį, kad yra daug daugiau CSP direktyvų nei tik šios keturios, parodytos aukščiau. Naršyklė skaitys CSP antraštę ir pritaikys tas direktyvas viskam, kas yra HTML faile, kuris buvo pateiktas. Jei direktyvos yra nustatytos tinkamai, jose leidžiama tik tai, kas būtina.

Jei nėra CSP antraštės, viskas eina ir niekas nėra ribojama. Visur *tai yra pakaitos simbolis. Galite įsivaizduoti, kad pakeisite *bet ką, ir tai bus leista.

HTTPS arba „HTTP Secure“

Be abejo, esate girdėję apie HTTPS. Gal esate girdėję kai kuriuos žmones sakant ...

Kodėl man rūpi naudoti HTTPS, jei esu tik svetainėje, žaidžianti žaidimą.

O gal girdėjote kitą pusę ...

Jūs esate išprotėjęs, jei jūsų svetainėje nėra HTTPS. Tai 2018 metai! Nepasitikėkite niekuo, kuris sako kitaip.

Galbūt girdėjote, kad „Chrome“ dabar pažymės jūsų svetainę kaip nesaugią, jei ji nėra HTTPS.

Iš esmės HTTPS yra gana paprasta. HTTPS yra užšifruotas, o HTTP - ne.

Taigi kodėl tai svarbu, jei nesiunčiate neskelbtinų duomenų?

Pasiruoškite kitam trumpiniui ... MITM, kuris reiškia žmogų viduryje.

Jei kavinėje naudojate viešąjį „Wi-Fi“ be slaptažodžio, kažkas gali gana lengvai elgtis kaip jūsų maršrutizatorius, kad visos užklausos ir atsakymai vyktų per juos. Jei jūsų duomenys nėra užšifruoti, jie gali su jais daryti ką tik nori. Jie gali redaguoti HTML, CSS ar „JavaScript“, kol jie net nepatenka į jūsų naršyklę. Atsižvelgdami į tai, ką žinome apie XSS, galite įsivaizduoti, kaip tai gali būti blogai.

Gerai, bet kaip mano kompiuteris ir serveris žino, kaip šifruoti / iššifruoti, bet šis MITM ne?

That’s where SSL (Secure Sockets Layer) and more recently, TLS (Transport Layer Security) come in. TLS took over for SSL in 1999 as the encryption technology used within HTTPS. Exactly how TLS works is outside of the scope of this post.

HTTP Strict-Transport-Security (HSTS)

This one is pretty straightforward. Let’s use Facebook’s header as an example again:

strict-transport-security: max-age=15552000; preload
  • max-age specifies how long a browser should remember to force the user to access a website using HTTPS.
  • preload is not important for our purposes. It is a service hosted by Google and not part of the HSTS specification.

This header only applies if you accessed the site using HTTPS. If you accessed the site via HTTP, the header is ignored. The reason is that, quite simply, HTTP is so insecure that it can’t be trusted.

Let’s use the Facebook example to further illustrate how this is helpful in practice. You are accessing facebook.com for the first time, and you know HTTPS is safer than HTTP, so you access it over HTTPS, //facebook.com. When your browser receives the HTML, it receives the header above which tells your browser to force-redirect you to HTTPS for future requests. One month later, someone sends you a link to Facebook using HTTP, //facebook.com, and you click on it. Since one month is less than the 15552000 seconds specified by the max-age directive, your browser will send the request as HTTPS, preventing a potential MITM attack.

Closing Thoughts

Žiniatinklio sauga yra svarbi, nesvarbu, kur bebūtumėte kurdami internetą. Kuo labiau save tai apnuoginsi, tuo geriau tau seksis. Saugumas yra svarbus dalykas visiems, ne tik žmonėms, kurie jį aiškiai įvardija savo pareigose! ?