Part 05 · Browser · 5.1.07

Same-origin, CORS, CSRF, XSS và CSP

Browser security là tập hợp các boundary khác nhau: origin quyết định script access, cookie policy quyết định credential gửi đi, CORS quyết định response đọc được và CSP giảm khả năng script độc chạy.

Không nhầm: CORS không phải server-side authorization; CSRF không phải XSS; HttpOnly chặn đọc cookie nhưng không ngăn script gửi request authenticated.

1. Origin model

Origin = scheme + host + port. Same-origin policy hạn chế script đọc/tương tác cross-origin, nhưng browser vẫn có thể gửi nhiều request hoặc embed resource. Site/eTLD+1 khác origin và quan trọng khi phân tích SameSite cookie; đừng dùng “cùng domain” như từ đồng nghĩa “same-origin”.

https://app.example.com:443
scheme        host             port
https         app.example.com  443

2. CORS là browser read opt-in

Server opt-in cho browser script đọc response qua Access-Control-Allow-Origin. Non-simple request thường có preflight OPTIONS. Credentialed request cần origin cụ thể, Access-Control-Allow-Credentials: trueVary: Origin; wildcard không được dùng cùng credentials.

3. CSRF và cookie credentials

CSRF xảy ra khi attacker khiến browser của victim gửi state-changing request với cookie tự động. Dùng synchronizer token hoặc double-submit, SameSite phù hợp, Origin/Referer checks và cấm side effect qua GET. XSS có thể đọc DOM hoặc gửi request trong origin nên có thể vượt nhiều CSRF controls.

ControlGiảm rủi roGiới hạn
SameSiteGiảm cross-site cookie sendKhông thay thế authorization/encoding; có flow hợp lệ cần cross-site
CSRF tokenBinding request với sessionPhải giữ secret và tránh leak qua URL/log
Origin/RefererReject cross-site state changeHeader có thể vắng mặt trong một số client/privacy mode

4. XSS và output context

Stored, reflected và DOM XSS chạy script trong origin của ứng dụng. Dùng auto-escaping template, context-sensitive output encoding, safe DOM APIs, sanitizer cho rich HTML và tránh eval/innerHTML không tin cậy. HttpOnly giảm token theft nhưng script vẫn có thể gọi API trong session.

// unsafe: attacker-controlled string becomes HTML
element.innerHTML = userInput;
// safer: text context
element.textContent = userInput;

5. CSP và security headers

Content-Security-Policy giới hạn script/style/connect/frame sources. Nonce/hash kết hợp strict-dynamic thường mạnh hơn allow-list host. Bắt đầu bằng Report-Only, thu violation telemetry rồi enforce; CSP là defense-in-depth, không thay encoding và sanitizer.

6. Cookies, storage và browser architecture

Secure yêu cầu HTTPS; HttpOnly chặn JS đọc; SameSite=Lax/Strict/None điều khiển cross-site send; prefix __Host- tăng constraints. localStorage dễ bị XSS lấy token và không có expiry tự động. BFF/session cookie thường giảm access-token exposure trong SPA nhưng đưa state/CSRF/scale vào backend.

Review checklist: origin nào được phép; credential nào tự gửi; response nào được đọc; state-changing method có CSRF defense; output context đã encode; CSP violation có telemetry chưa?
Tài liệu: MDN Same-origin Policy · MDN CORS · OWASP XSS · MDN CSP