HTTP-vastuse päised ütlevad brauserile, kuidas teie lehtedega ümber käia: milliseid skripte tohib käivitada, kas saiti tohib raamida ja kas see tuleb alati laadida HTTPS-i kaudu. Käputäis neist blokeerib peaaegu kuluta terveid ründeliike. Teised on aegunud ja tekitavad ainult müra või isegi riski.
Lähtetase, millest alustada
See on mõistlik lähtepunkt HTML-rakendusele, mida pakutakse ainult HTTPS-i kaudu. Ärge kleepige seda muutmata. Eriti CSP peab vastama sellele, kuidas teie lehed skripte laadivad, selle nonce peab olema iga vastuse jaoks uus ja HSTS-i eellaadimist on raske tagasi võtta.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: script-src 'nonce-3f9a1c7e2b' 'strict-dynamic'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), camera=(), microphone=()
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-site
Content-Security-Policy
CSP piirab, kust skriptid ja muud ressursid tohivad tulla. Selle peamine ülesanne on muuta saitidevahelise skriptimise (XSS) haavatavused palju raskemini ärakasutatavaks.
OWASP-i CSP spikker eelistab pikale lubatud domeenide loendile nonce’idel või räsidel põhinevat ranget poliitikat. Liiga laiadest või liiga detailsetest lubatud loenditest pääsetakse sageli mööda. Nonce’il põhinev poliitika näeb välja selline:
Content-Security-Policy: script-src 'nonce-3f9a1c7e2b' 'strict-dynamic'; object-src 'none'; base-uri 'none'
Iga skriptisilt kannab siis sama väärtust, näiteks <script nonce="3f9a1c7e2b">. Nonce peab olema juhuslik ja iga vastuse jaoks uus; fikseeritud väärtus nullib selle mõtte. Looge see oma mallikihis. OWASP hoiatab vahevara eest, mis lisab nonce’i igale skriptisildile, sest see õnnistaks ka süstitud skripte.
Kui teie lehed on staatilised, kasutage selle asemel räsisid: iga tekstisisese skripti jaoks väärtus 'sha256-...'. Iga muudatus skriptis, isegi tühikutes, muudab räsi.
Vältige direktiivis script-src väärtusi 'unsafe-inline' ja 'unsafe-eval'. Need avavad uuesti täpselt selle, mille sulgemiseks CSP on mõeldud.
Et kasutuselevõtt midagi katki ei teeks, saatke poliitika esmalt päisena Content-Security-Policy-Report-Only. Brauserid teatavad rikkumistest ilma midagi blokeerimata. Parandage see, mida aruanded näitavad, ja minge seejärel üle jõustamisele.
Trusted Types
Trusted Types on suunatud DOM-põhisele XSS-ile, kus teie enda JavaScript edastab ründaja kontrollitud stringe ohtlikele API-dele, nagu innerHTML, eval() või skriptielemendi src. Need lülitatakse sisse CSP-ga:
Content-Security-Policy: require-trusted-types-for 'script'; trusted-types app-policy
Kui jõustamine on sees, põhjustab lihtsa stringi edastamine mõnele neist sihtkohtadest vea. Kood peab edastama nimelise poliitika loodud väärtusi, tavaliselt sellise, mis puhastab HTML-i. MDN märgib API alates 2026. aasta veebruarist Baseline-staatusega, mis tähendab, et see töötab suuremate brauserite praegustes versioonides. Alustage report-only-režiimis, sest olemasolev kood võib kirjutada stringe otse DOM-i.
Strict-Transport-Security ja eellaadimine
HSTS käsib brauseritel ühenduda teie domeeniga ainult HTTPS-i kaudu nii mitme sekundi jooksul, kui on määratud väärtusega max-age. Koos includeSubDomains’iga hõlmab reegel ka kõiki alamdomeene.
Eellaadimise nimekiri läheb veelgi kaugemale. Brauserid tulevad nimekirjaga sisseehitatult, seega kasutab HTTPS-i isegi esimene külastus teie domeenile. Saidi hstspreload.org nõuded on:
- kehtiv sertifikaat ja suunamine HTTP-lt HTTPS-ile samal hostil
- kõiki alamdomeene, ka sisemisi, pakutakse HTTPS-i kaudu
max-agevähemalt 31536000 (üks aasta) ning lisaksincludeSubDomainsjapreload- HSTS-päis ka HTTPS-saidilt tulevatel suunamistel
Võtke see kasutusele etappide kaupa. Eellaadimise sait soovitab alustada väärtusega max-age=300, seejärel kasutada üht nädalat (604800) ja siis üht kuud (2592000), jälgides igal sammul, kas midagi läheb katki. Eellaadimise nimekirjast eemaldamine jõuab kasutajateni alles kuude pärast, seega veenduge, et iga alamdomeen suudab HTTPS-i pikaajaliselt toetada.
X-Content-Type-Options
X-Content-Type-Options: nosniff takistab brauseritel faili tüüpi selle sisu järgi ära arvamast. Kasutage seda koos õige Content-Type päisega igas vastuses, HTML-i puhul koos charset’iga, näiteks text/html; charset=UTF-8.
frame-ancestors ja X-Frame-Options
Klõpsuröövimine toimib nii, et teie leht laaditakse nähtamatult teise saidi raami sisse. CSP direktiiv frame-ancestors määrab, kes tohib teie lehte raamida, ja OWASP märgib, et seda toetavates brauserites asendab see päise X-Frame-Options.
Kaks üksikasja kipuvad inimesi üllatama. MDN-i järgi ei kasuta frame-ancestors varuvariandina default-src’i, seega tuleb see selgesõnaliselt määrata. Samuti pole sellel <meta>-sildis mingit mõju; see töötab ainult päisena. Vanemate brauserite jaoks ei tee kahju saata mõlemat:
Content-Security-Policy: frame-ancestors 'none'
X-Frame-Options: DENY
Kasutage frame-ancestors 'self', kui teie enda sait raamib oma lehti. Vältige aegunud väärtust X-Frame-Options: ALLOW-FROM. MDN märgib, et kaasaegsed brauserid eiravad selle nägemisel kogu päist.
Referrer-Policy
See päis määrab, kui suur osa praegusest URL-ist saadetakse teistele saitidele päises Referer. Kui te midagi ei määra, kasutavad brauserid vaikimisi väärtust strict-origin-when-cross-origin, mis saadab HTTPS-i kaudu teistele saitidele ainult päritolu. OWASP soovitab siiski selle selgesõnaliselt määrata. Kasutage no-referrer või same-origin, kui teie URL-id võivad sisaldada tõendeid või isikuandmeid.
Permissions-Policy
Permissions-Policy lülitab välja brauseri funktsioonid, mida teie sait ei kasuta. Tühi lubatud loend () keelab funktsiooni teie lehel ja igas selle sees olevas raamis:
Permissions-Policy: geolocation=(), camera=(), microphone=(), payment=()
Kui funktsiooni on vaja, lubage seda kitsalt, näiteks camera=(self).
COOP ja CORP
Cross-Origin-Opener-Policy: same-origin paigutab teie lehe oma sirvimiskonteksti rühma. Leht, mis avab teie lehe funktsiooniga window.open(), ei saa seejärel sellele viidet säilitada, mis sulgeb terve klassi saitidevahelisi lekkeründeid (XS-Leaks). Kui kasutate ühekordse sisselogimise või maksete jaoks hüpikaknaid, hoiab same-origin-allow-popups need töös.
Cross-Origin-Resource-Policy: same-site takistab teistel saitidel teie ressursse, näiteks pilte või skripte, manustamast. Cross-Origin-Embedder-Policy: require-corp on vajalik ainult päritoluülese isolatsiooni jaoks, mida nõuavad sellised funktsioonid nagu SharedArrayBuffer. Jätke COEP välja, kui te neid funktsioone ei vaja, sest see blokeerib päritoluülesed ressursid, mis pole sellega nõustunud.
Päised, millest loobuda
| Päis | Olek | Mida teha |
|---|---|---|
X-XSS-Protection | Aegunud ja mittestandardne; MDN hoiatab, et see võib muidu turvalistes saitides XSS-vigu tekitada | Eemaldage see või saatke 0 ja tuginege CSP-le |
Expect-CT | Aegunud | Eemaldage see |
Public-Key-Pins | Eemaldatud Chromiumist 2018. aastal | Eemaldage see; kasutage selle asemel sertifikaatide läbipaistvust (Certificate Transparency) ja CAA-kirjeid |
X-Frame-Options: ALLOW-FROM | Aegunud | Kasutage frame-ancestors direktiivi |
Server, X-Powered-By | Paljastavad tarkvara ja versioonid | Eemaldage need või kasutage neutraalset väärtust |
Kust alustada
- Kontrollige meie turvapäiste skanneriga, mida teie sait praegu saadab.
- Lisage kõigepealt väikese riskiga päised:
X-Content-Type-Options,Referrer-Policy,Permissions-Policyjaframe-ancestors. - Võtke HSTS kasutusele lühikese
max-ageväärtusega ja suurendage seda järk-järgult. Kaaluge eellaadimist alles siis, kui kõik alamdomeenid on valmis. - Käitage CSP-d mõni nädal report-only-režiimis, parandage rikkumised ja jõustage see seejärel.
Kui ehitate uut rakendust ja soovite, et need oleksid algusest peale lahendusse sisse projekteeritud, aitab meie turvalise tarkvaraarenduse meeskond.
