You are on page 1of 8

I.

GIỚI THIỆU TỔNG QUAN


1. Content Security Policy
- Content Security Policy (CSP) là một biện pháp bảo mật từ phía trình duyệt, giúp
ngăn chặn những request xấu được gọi từ website của chúng ta.
- CSP là tập hợp một danh sách các nguồn gốc nội dung an toàn mà trình duyệt sẽ
được phép tải trên trang web đó – các loại nội dung bao gồm như: JavaScript,
CSS, HTML Frames, web workers, fonts, images,…
- Để bật CSP, chúng ta cần cấu hình máy chủ web trả về Content-Security-Policy
với giá trị chứa chính sách trong HTTP Response Header.
2. Content Security Policy giúp giảm thiểu các cuộc tấn công
- CSP giúp phát hiện và giảm thiểu một số loại tấn công như Cross-Site-Scripting
(XSS), Click Jacking, Code Injection. Các cuộc tấn công này được sử dụng cho
nhiều mục đích như đánh cắp dữ liệu, phá hoại trang web, phát tán phần mềm độc
hại.
- Tiêu biểu như tấn công XSS khai thác sự tin cậy của trình duyệt đối với nội dung
nhận được từ máy chủ. Các mã script độc hại được thực thi bởi trình duyệt của nạn
nhân vì trình duyệt tin cậy nguồn của nội dung.
 CSP giúp giảm thiểu và báo cáo các cuộc tấn công XSS.
3. Trình duyệt hỗ trợ Content Security Policy
- Content Security Policy được hỗ trợ bởi tất cả các trình duyệt chính hiện đại và đã
được nhiều năm. Nó không hỗ trợ được trong Internet Explorer.
- CSP 1.0 được hỗ trợ bởi khoảng 80% trình duyệt hiện nay, bao gồm cả trình duyệt
trên di động (iOS, Android browser từ bản 4.4, Chrome trên Android). IE 10 và 11
chỉ hỗ trợ header kiểu cũ X-Content-Security-Policy và chỉ sandbox directive.
- Phiên bản 1 của các tiêu chuẩn về CSP đã định nghĩa rất nhiều thứ cần có. CSP 2.0
(và cả phiên bản trung gian 1.1) đã thêm 1 số directive, chủ yếu liên quan đến
frame, nguồn cho endpoint của form, các plugin được cho phép. Chúng cũng hỗ
trợ nonce để sign các inline style và script với 1 mã hash duy nhất.
- Lưu ý rằng nếu sử dụng cả hai header Content-Security-Policy và X-Content-
Security-Policy hoặc X-Webkit-CSP sẽ gây ra các hành vi không mong muốn trên
một số phiên bản trình duyệt nhất định.
4. Các chỉ thị (directive) của CSP
- Các header Content-Security-Policy được tạo thành từ một hoặc nhiều directive.
Nhiều directive được phân tách nhau bằng dấu chấm phẩy.
Tên directive Mô tả
default-src Chỉ định các chính sách mặc định cho việc lấy tài
nguyên như JavaScript, Image, CSS, Font, AJAX
request, Frame, HTML5 Media,…
script-src Chỉ định những nguồn được tải cho các tài nguyên
JavaScript.
style-src Chỉ định những nguồn được tải cho các tài nguyên CSS.
img-src Chỉ định những nguồn được tải cho các tài nguyên là
hình ảnh.
connect-src Chỉ định những nguồn được tải cho các request Ajax,
WebSocket.
font-src Chỉ định những nguồn được tải cho các tài nguyên là
webfont.
object-src Chỉ định những nguồn hợp lệ của plugin, ví dụ như các
element: <object>, <embed>, <applet>.
media-src Chỉ định những nguồn được tải cho các tài nguyên là âm
thanh và video, ví dụ như các element <audio>,
<video>.
frame-src Chỉ định những nguồn được tải cho các tài nguyên là
frame, ví dụ như <iframe>.
sandbox Bật sandbox cho tài nguyên được yêu cầu tương tự như
thuộc tính iframe, sandbox. Sandbox áp dụng same
origin policy (SOP), ngăn chặn popup, plugin và thực
thi script.
report-uri Hướng dẫn trình duyệt POST báo cáo về lỗi chính sách
CSP lên URI chỉ định.
child-src Chỉ định những nguồn được tải cho web worker và các
ngữ cảnh duyệt web lồng nhau bằng cách sử dụng các
element như <frame>, <iframe>.
form-action Hạn chế các URL có thể được sử dụng làm mục tiêu của
việc gửi form từ một ngữ cảnh nhất định.
frame-ancestors Chỉ định những nguồn hợp lệ để nhúng tài nguyên đang
sử dụng <frame>, <iframe>, <object>, <embed>,
<applet>.
plugin-types Chỉ định các kiểu MIME hợp lệ cho các plugin được gọi
qua <object>, <embed>.
base-uri Chỉ định một tập hợp các URL được phép sử dụng trong
thuộc tính href của thẻ <base> trong HTML.
report-to Chỉ định tên của nhóm báo cáo tại nơi gửi báo cáo vi
phạm CSP được xác địng bằng Report-To response
header.
worker-src Hạn chế các URL có thể được tải dưới dạng Worker,
SharedWorker hoặc ServiceWorker.
manifest-src Hạn chế các URL mà ứng dụng kê khai (Manifest) có
thể được tải.
prefetch-src Chỉ định những nguồn hợp lệ cho yêu cầu tìm nạp trước
và hiển thị trước. Ví dụ như trong thẻ <link> có thuộc
tính rel=”prefetch” hoặc rel=”prerender”.
navigate-to Hạn chế các URL mà một tài liệu có thể điều hướng đến
bằng bất kỳ phương thức nào.

- Link tham khảo thêm về các directive của CSP:


+ Content Security Policy Level 2: https://www.w3.org/TR/CSP2/#directives
+ Content Security Policy Level 3: https://www.w3.org/TR/CSP3/#csp-directives

5. Thuộc tính và giá trị của CSP directive


Giá trị của CSP Ví dụ Mô tả
directive
* img-src * Giá trị wildcard, cho phép bất kỳ
URL nào ngoại trừ data: blob:
filesystem: schemes.
‘self’ script-src ‘self’ Cho phép tải tài nguyên từ cùng một
origin (cùng scheme, host, port).
‘none’ object-src ‘none’ Không cho phép tải từ bất kỳ nguồn
nào, kể cả domain hiện tại.
data: img-src ‘self’ data: Cho phép tải tài nguyên thông qua
data scheme. Ví dụ: hình ảnh mã hóa
Base64.
www.domain.com img-src Cho phép tải tài nguyên từ tên miền
www.domain.com được chỉ định, ví dụ
www.domain.com. Tuy nhiên,
www.domain.com và domain.com
được xem là hoàn toàn khác nhau.
domain.com img-src domain.com Cho phép tải tài nguyên từ tên miền
được chỉ định, ví dụ domain.com.
Tuy nhiên không cho phép tải từ
www.domain.com, sub.domain.com,
cdn.domain.com,…
*.domain.com img-src Cho phép tải tên miền từ bất kỳ tên
*.domain.com miền phụ nào theo domain.com. Ví
dụ: www.domain.com,
sub.domain.com, cdn.domain.com,

https://domain.com img-src Chỉ cho phép tải tài nguyên qua giao
https://domain.com thức HTTPS phù hợp với tên miền
nhất định.
https: img-src https: Chỉ cho phép tải từ nguồn sử dụng
giao thức HTTPS trên bất kỳ tên
miền nào.
‘unsafe-inline’ script-src ‘unsafe- Cho phép thực thi các đoạn mã CSS
inline’ hoặc JavaScript được nhúng trực tiếp
vào mã nguồn (inline style).
‘unsafe-eval’ script-src ‘unsafe- Cho phép chạy hàm eval(). Hàm này
eval’ dùng để đánh giá hoặc thực thi một
đối số. Đây là một hàm khá nguy
hiểm của JavaScript.
‘sha256-‘ script-src ‘sha256- Cho phép inline script hoặc CSS
xyz…’ thực thi nếu hàm băm được chỉ định
trong header. CSP Level 2 hiện đang
hỗ trợ hàm băm SHA256, SHA384,
SHA512.
‘nonce-‘ script-src ‘nonce- Cho phép inline script hoặc CSS
r@nd0m’ thực thi nếu thẻ script (ví dụ <script
nonce=”r@nd0m”>) chứa thuộc tính
nonce khớp với nonce được chỉ định
trong header CSP. Nonce phải là một
chuỗi ngẫu nhiên an toàn và không
được sử dụng lại.
‘strict-dynamic’ script-src ‘strict- Cho phép một đoạn mã script được
dynamic’ phép tải các đoạn mã script bổ sung
thông qua non-“parser-inserted”
script element. Ví dụ
document.createElement(‘script’);
được cho phép.
‘unsafe-hashes’ script-src ‘unsafe- Cho phép thực thi các đoạn mã script
hashes’ ‘sha256- trong trình xử lý sự kiện (ví dụ
abc…’ onclick). Không áp dụng cho
javascript: hoặc inline <script>.

Link tham khảo thêm về thuộc tính và giá trị của CSP directive:
- Content Security Policy Level 2: https://www.w3.org/TR/CSP2/#examples
- Content Security Policy Level 3: https://www.w3.org/TR/CSP3/#authoring-
considerations

6. Ví dụ về Content-Security-Policy
Dưới đây là một số rule phổ biến được áp dụng trong Content-Security-Policy:
- Cho phép tải tất cả cái loại tài nguyên từ cùng một origin (cùng scheme, host,
port).
default-src ‘self’;
+ default-src: Chỉ định các chính sách mặc định cho việc lấy tất cả các loại tài
nguyên như JavaScript, Image, CSS, Font, AJAX request, Frame, HTML5 Media,

+ self: Cho phép tải tài nguyên từ cùng một origin.
- Chỉ cho phép tải các đoạn mã script từ cùng một origin.
script-src ‘self’;
+ script-src: Chỉ định những nguồn được tải cho các tài nguyên JavaScript.
+ self: Cho phép tải tài nguyên từ cùng một origin.
- Cho phép tải các đoạn mã script từ cùng một origin, Google Analytics, Google
AJAX CDN.
script-src ‘self’ www.google-analytics.com ajax.googleapis.com;
+ script-src: Chỉ định những nguồn được tải cho các tài nguyên JavaScript.
+ self: Cho phép tải tài nguyên từ cùng một origin.
+ www.google-analytics.com ajax.googleapis.com: Cho phép tải tài nguyên từ tên
miền được chỉ định là www.google-analytics.com và ajax.googleapis.com
- Chính sách dành cho người mới bắt đầu cấu hình CSP: cho phép tải tất cả các
image, script, AJAX, form action và CSS từ cùng một origin nhưng không cho
phép tải bất kỳ tài nguyên nào khác (ví dụ như: object, frame, media,…)
default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src
'self';base-uri 'self';form-action 'self'
+ default-src 'none'; : Đầu tiên, chỉ định không cho phép tải tất cả các loại tài
nguyên từ bất kỳ nguồn nào.
+ script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri
'self';form-action 'self': Sau đó, thêm chỉ định cho phép tải script, AJAX, web
socket, image, CSS, form action từ cùng một origin. Cẩn thận hơn, chỉ định base
URL phải là cùng origin cho tất cả các URL tương đối trong trang (base-uri:
‘self’).
7. Thông báo lỗi vi phạm chính sách trong Content-Security-Policy
- Trong Chrome khi xảy ra vi phạm chính sách trên CSP về việc tải tài nguyên là
các đoạn mã script, người dùng sẽ nhận được thông báo như sau trong Chrome
Developer Tools:
Refused to load the script 'script-uri' because it violates the following Content
Security Policy directive: "CSP directive".
+ Ví dụ:

- Tuy nhiên trên Firefox, người dùng sẽ nhận được thông báo như sau trong Web
Developer Tools:

- Ngoài việc thông báo lỗi vi phạm trên console, một sự kiện
securitypolicyviolation được kích hoạt trên cửa sổ.
+ Link tham khảo thêm về việc kích hoạt sự kiện vi phạm trong CSP:
https://www.w3.org/TR/CSP2/#firing-securitypolicyviolationevent-events
8. Cấu hình CSP trên máy chủ
Bất kỳ môi trường lập trình phía máy chủ nào cũng phải cho phép gửi một HTTP
response header được tùy chỉnh. CSP được thêm vào phần HTTP Responese
header. Chúng ta có thể cấu hình web server để gửi HTTP response header có
chứa CSP.
- Apache Content-Security-Policy Header
Thêm vào file httpd.conf trong VirtualHost hoặc file .htaccess. Ví dụ:
Header set Content-Security-Policy “default-src ‘self’;”
- Nginx Content-Security-Policy Header
Thêm vào trong block của server{}. Ví dụ:
add_header Content-Security-Policy “default-src ‘self’;”;
 Chúng ta có thêm always vào cuối dòng lệnh để đảm bảo rằng nginx gửi
header mà không cần mã phản hồi.
- IIS Content-Security-Policy Header
Có hai cách cấu hình như sau:
+ Sử dụng HTTP Response Headers GUI trong IIS Manager.
+ Ngoài ra, có thể thêm vào trong file web.config. Ví dụ:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="default-src
'self';" />
</customHeaders>
</httpProtocol>
</system.webServer>

You might also like