უსაფრთხოების პოლიტიკა და CSP
1) რატომ გვჭირდება უსაფრთხოების პოლიტიკოსები
თანამედროვე საყრდენი და API დამოკიდებულია მრავალ წყაროზე (CDN, ანალიტიკა, PSP, 3DS, ჩატი). მკაცრი პოლიტიკოსის გარეშე, იზრდება XSS რისკები, კლიშე, მონაცემთა გაჟონვა და სესიების ქურდობა. უსაფრთხოების პოლიტიკოსები ზღუდავენ იმას, რაც ნებადართულია ბრაუზერის მოდელში გადატანისას „მხოლოდ აშკარად დაშვებულია“.
2) ბაზის სვეტები
CSP (შინაარსის უსაფრთხოების პოლიტიკა) არის JS/CSS/მედიის ნებადართული წყაროებისა და ქცევის ცენტრალიზებული „მენიუ“.
Trusted Types არის DOM-XSS- ის დაცვა ტიპის დონეზე.
SRI (Subresource Integrity) - სკრიპტების/სტილის მთლიანობის კონტროლი.
COOP/COEP/CORP - კონტექსტებისა და რესურსების მკაცრი იზოლაცია წყაროებს შორის.
Fetch Metadata ('Sec-Fetch-') - სერვერის გამოსავალი ჯვარედინი მოთხოვნების ფილტრაციისთვის.
CORS არის API- ზე ინტერნეტის წვდომის პოლიტიკა.
კლასიკური სათაურები: HSTS, 'X-Frame-Options '/' frame-ancestors', 'Referrer-Policy', 'Permissions-Policy', SameSite-cokies.
3) CSP: საფუძველი და პრინციპები
3. 1 დირექტივები (ძირითადი)
'default-src' - ნაგულისხმევი სხვა დირექტივებისთვის.
'script src' - წყაროები JS, nonce/hash, 'strict-dynamic', 'report-sample'.
'style-src' - CSS წყაროები; მინიმუმამდე დაყვანა 'unsafe-inline'.
`img-src`, `font-src`, `media-src`, `object-src` (обычно `none`).
'connect-src' - ქსელის მოთხოვნები (XHR/fetch/WebSocket).
'frame-src '/' child-src' - მესამე მხარის ჩარჩოები (PSP, 3DS).
'frame-ancestors' - ვის შეუძლია ჩვენი საიტის შექმნა.
'base-uri' - ჩანაცვლების აკრძალვა '<base>'.
'form action' - სადაც ნებადართულია ფორმები.
'upgrade-insecure-requests', 'block-all-mixed-შინაარსი' - ბრძოლა HTTP/HTTPS მიქსის წინააღმდეგ.
'ანგარიში '/' ანგარიში' - სად უნდა გააგზავნოს დარღვევები.
3. 2 Nonce и hash
Nonce მიდგომა: თითოეული HTTP პასუხისთვის, შექმნათ კრიპტო-შემთხვევითი' nonce', დაამატეთ '<script nonce ="...>" და' script-src 'nonce- ში... ".
Hash მიდგომა: ინლაინის შინაარსის ფიქსირებული ჰაში. შესაფერისია სტატიკური HTML- სთვის, დინამიკის დროს არასასიამოვნოა.
'სტანდარტული დინამიკა': ენდობა მხოლოდ „სანდო“ სკრიპტით დატვირთულ სკრიპტებს (nonce/hash). ის ასუფთავებს დინამიური დატვირთვის დროს სამიზნე დომენების ჩამოთვლის აუცილებლობას, მაგრამ მოითხოვს თანამედროვე ბრაუზერებს.
3. 3 აკრძალვა 'unsafe-'
თავიდან აიცილოთ 'unsafe-inline', 'unsafe-eval'. თუ ჩარჩო მოითხოვს eval- ს (მაგალითად, წყაროს-რვეული dev- ში), შედის მხოლოდ dev- ში.
სტილისთვის - გამოიყენეთ 'nonce' ან 'hash', თუ ეს შესაძლებელია ინლაინების გარეშე.
3. 4 მკაცრი CSP - ის მაგალითი
Content-Security-Policy:
default-src 'none';
base-uri 'self';
object-src 'none';
script-src 'self' 'nonce-{RANDOM}' 'strict-dynamic' https://www. googletagmanager. com;
style-src 'self' 'nonce-{RANDOM}';
img-src 'self' data: https://images. example-cdn. com;
font-src 'self' https://fonts. gstatic. com;
connect-src 'self' https://api. example. com wss://ws. example. com;
frame-src https://3ds. psp. com https://pay. psp. com;
frame-ancestors 'none';
form-action 'self' https://pay. psp. com;
upgrade-insecure-requests;
report-to csp-endpoint; report-sample
4) Trusted Types (DOM-XSS)
ჩართეთ დირექტივა: 'Content-Security-Policy: require-trusted-types-for' script '; trusted-types app default`.
შექმენით ერთიანი კოდი პოლიტიკა ('window. trustedTypes. createPolicy('app', { createHTML() {... } })`).
აკრძალეთ სახიფათო დავალებები ('element. innerHTML =...`) без Trusted Types.
ინტეგრაცია ჩარჩოებთან (React/Angular/Vue): გამოიყენეთ უსაფრთხო randering API, თავიდან აიცილეთ საშიში dangerouslysSetInERHTM.
5) SRI (CDN მთლიანობა)
გარე '<script> '/' link <' link> 'გამოიყენეთ' integrity = "sha256-"... crossorigin = "anonymous" ".
SRI ავსებს და არ შეცვლის CSP. CDN ვერსიის განახლებისას - განაახლეთ ჰაში.
6) კლიჩკინგი და ჩარჩოები
თანამედროვე მეთოდია 'frame-ancestors' (შეცვლის მოძველებულ 'X-Frame-Options').