Defaults.Exposed

Defaults.ExposedCách khắc phục › Bảo vệ MIME-sniffing (X-Content-Type-Options)

Cách khắc phục Bảo vệ MIME-sniffing (X-Content-Type-Options)

Một header một dòng ngăn trình duyệt đoán loại file thực sự là gì. Không có nó, file ai đó tải lên trang của bạn — hoặc file trên các trang của bạn — có thể bị trình duyệt hiểu sai và chạy như mã, đó chính xác là cách một số cuộc tấn công biến upload trông vô hại thành cách đánh cắp phiên của khách hàng.

Điểm mấu chốt với doanh nghiệp bạn: Thiếu header này là dấu hiệu rõ ràng, có thể quét được rằng những điều cơ bản không được bảo đảm. Bản thân nó hiếm khi làm sập trang, nhưng kết hợp với form upload file hoặc nội dung do người dùng tạo nó mở đường cho kẻ tấn công chạy mã độc trong trình duyệt của khách truy cập — chiếm đoạt phiên đã đăng nhập, đánh cắp thông tin nhập thẻ hoặc đăng nhập, và đặt bạn vào phía sai của cuộc trò chuyện vi phạm dữ liệu. Đây là một trong những bản sửa rẻ nhất trong bảo mật: một dòng, miễn phí, khoảng năm phút.

Điều này có thể gây thiệt hại gì

Tại sao điều này quan trọng. Trình duyệt, khi máy chủ mơ hồ về một file là gì, sẽ cố đoán ('sniff') loại nội dung. Kẻ tấn công khai thác đoán đó: upload file mà máy chủ gắn nhãn là ảnh, nhưng tạo nội dung của nó để trình duyệt quyết định thực ra là JavaScript — và chạy nó. Header X-Content-Type-Options: nosniff nói với mọi trình duyệt dừng đoán và tin loại máy chủ đã nêu, đóng toàn bộ lớp mánh khóe đó. Đây là kiểm tra có điểm đáng 25 điểm và được đánh giá nghiêm trọng trung bình khi thiếu.

Tóm tắt ngắn cho chủ sở hữu

Có một giả định yên lặng được tích hợp vào mọi trình duyệt web: khi nó tải file từ trang của bạn, nó cố tìm ra loại file đó là gì. Thông thường nó tin tưởng máy chủ. Nhưng nếu máy chủ của bạn mơ hồ, trình duyệt sẽ đoán — và việc đoán đó được gọi là MIME-sniffing.

Vấn đề là kẻ tấn công có thể lợi dụng cú đoán. Chúng có thể tạo file mà máy chủ của bạn thực sự tin là ảnh vô hại, nhưng trình duyệt, được để đoán, quyết định thực ra là một đoạn mã chương trình — và sau đó chạy nó, ngay bên trong trình duyệt của khách hàng, trên tên miền của bạn.

Có một hướng dẫn một dòng tắt việc đoán: X-Content-Type-Options: nosniff. Nó nói với mọi trình duyệt, “đừng đoán — tin chính xác những gì máy chủ của tôi nói với bạn.” Đó là toàn bộ bản sửa. Miễn phí, mất khoảng năm phút, và trên trang được xây dựng đúng nó không làm hỏng gì.

Kiểm tra này tìm header đó. Nếu thiếu, bạn mất 25 điểm và được đánh giá vấn đề nghiêm trọng trung bình — không phải vì header đơn lẻ là thảm họa, mà vì vắng mặt của nó là dấu hiệu đáng tin rằng những điều cơ bản chưa được khóa chặt.

Điều này có thể khiến bạn mất gì

Đây là các kịch bản thực tế, cấp độ kinh doanh — không phải kịch bản xấu nhất.

Không ai trong số này cần kẻ tấn công tinh vi. Lạm dụng MIME-sniffing được hiểu rõ và tự động hóa, đó chính xác là lý do tại sao scanner gắn cờ header thiếu rất mạnh mẽ.

Thực ra nó là gì

Khi trình duyệt nhận được file, máy chủ được cho là gắn nhãn nó với loại nội dung (ví dụ, image/png cho ảnh PNG hoặc text/html cho trang web). Trong lịch sử, trình duyệt không hoàn toàn tin nhãn đó — một phần vì một số máy chủ làm sai — vì vậy chúng nhìn vào byte thực tế của file và tự quyết định. Việc nhìn đó là MIME-sniffing.

Đó là sự tiện lợi trở thành trách nhiệm. Nếu kẻ tấn công có thể đưa file vào trang của bạn (qua form upload, hộp bình luận, tài liệu được nhập) và ảnh hưởng đến nội dung của nó, chúng có thể tạo ra thứ mà máy chủ gắn nhãn vô hại nhưng trình duyệt sniff như script có thể thực thi. Trình duyệt sau đó chạy nó trên tên miền của bạn, với tất cả sự tin tưởng mà tên miền của bạn mang.

X-Content-Type-Options: nosniff xóa bỏ hoàn toàn việc đoán. Khi được đặt, trình duyệt được nói: dùng loại đã khai báo của máy chủ và không có gì khác. File được gắn nhãn là ảnh được coi là ảnh, thẳng thắn — ngay cả khi nội dung của nó trông như script. Vector tấn công đóng lại.

“Tốt” trông như thế nào: mọi response từ trang của bạn — trang và asset đều vậy — mang chính xác header này:

X-Content-Type-Options: nosniff

Không có giá trị hợp lệ nào khác và không cần điều chỉnh. Nếu CDN và máy chủ của bạn cả hai thêm nó (vì vậy bạn thấy nosniff, nosniff), điều đó ổn và vẫn tính là đạt.

Cách sửa (miễn phí, ~5 phút)

Chuyển phần này cho người chạy website của bạn — người IT, nhà phát triển web, hoặc hỗ trợ hosting. Bản sửa miễn phí và nhanh; không có gì cần mua. Những gì bạn cần yêu cầu rất đơn giản: “Thêm response header X-Content-Type-Options: nosniff vào mọi trang và asset trên trang.”

Đây là chi tiết cho họ, theo nền tảng phổ biến.

Cloudflare (hoặc CDN/proxy tương tự) — thường là nơi nhanh nhất để làm, bao phủ toàn trang một lần:

Nginx — thêm bên trong server (hoặc location) block liên quan:

add_header X-Content-Type-Options "nosniff" always;

Từ khóa always đảm bảo nó được gửi trên cả response lỗi. Reload Nginx sau khi lưu.

Apache — cần bật mod_headers; trong cấu hình trang hoặc .htaccess:

Header always set X-Content-Type-Options "nosniff"

IIS / Windows hosting — trong web.config dưới <system.webServer>:

<httpProtocol>
  <customHeaders>
    <add name="X-Content-Type-Options" value="nosniff" />
  </customHeaders>
</httpProtocol>

Node / Express — đặt cho mọi response:

app.use((req, res, next) => {
  res.setHeader('X-Content-Type-Options', 'nosniff');
  next();
});

(Hoặc dùng gói helmet, tự động đặt header này và một số header bảo mật khác theo mặc định.)

Trang Google Workspace / Microsoft 365: những thứ này quản lý email và tài liệu của bạn, không phải hosting website công khai, vì vậy header không được đặt ở đó — nó được đặt bất cứ nơi nào chính website được phục vụ (CDN, máy chủ web, hoặc site builder). Nếu bạn dùng site builder được lưu trữ (Squarespace, Wix, Shopify và tương tự), nhiều cái tự động thêm header này; kiểm tra kết quả thay vì giả định, và hỏi hỗ trợ của họ nếu thiếu.

Sau khi triển khai, xác minh. Chạy lại quét, hoặc nhờ nhà phát triển kiểm tra response header trong browser developer tools (tab Network → nhấp bất kỳ yêu cầu nào → Response Headers) và xác nhận X-Content-Type-Options: nosniff hiện diện. Kiểm tra trang ngắn gọn để xác nhận không có gì styled hoặc scripted bị hỏng — trên trang được xây dựng đúng, không có gì bị ảnh hưởng.

Các lỗi phổ biến

FAQ

Chúng tôi không để ai upload file. Chúng tôi có vẫn cần cái này không?

Có, và vẫn đáng làm. Header là phòng thủ theo chiều sâu: nó cũng ngăn trình duyệt đọc sai script, stylesheet và file dữ liệu được phục vụ từ chính trang của bạn, bảo vệ chống lại một số mánh khóe cross-site-scripting ngay cả trên các trang không có form upload. Nó không tốn gì và không bao giờ làm hỏng trang được cấu hình đúng, vì vậy không có lý do gì để bỏ qua.

Thêm điều này có làm hỏng gì trên website không?

Hầu như không bao giờ. nosniff đơn giản làm trình duyệt tôn trọng loại nội dung máy chủ của bạn đã gửi. Cách duy nhất nó gây vấn đề là nếu máy chủ của bạn gắn nhãn file sai — ví dụ gửi stylesheet hoặc script với loại sai. Nếu có gì đó bị hỏng, đó là lỗi thật mà nosniff phơi bày chứ không phải gây ra, và đáng sửa. Kiểm tra một lần sau khi triển khai.

'Tốt' thực sự trông như thế nào?

Một response header duy nhất trên mọi trang và asset: X-Content-Type-Options: nosniff. Đó là toàn bộ cấu hình đúng — không có giá trị hợp lệ nào khác và không cần điều chỉnh.

CDN (Cloudflare hoặc tương tự) và máy chủ của chúng tôi cả hai thêm nó — điều đó có vấn đề gì không?

Không. Thấy giá trị hai lần ('nosniff, nosniff') vì cả CDN và origin đặt nó là hoàn toàn ổn và vẫn đạt. Bạn không cần xóa một cái.

Sửa điều này có tốn tiền không?

Không. Bản sửa là một dòng cấu hình miễn phí trên máy chủ web hoặc CDN. Bất kỳ ai tính phí bạn để thêm một header duy nhất là tính quá. Những thứ duy nhất đáng trả tiền trong lĩnh vực này là theo dõi liên tục, xem portfolio trên nhiều trang, hoặc kiểm toán chính thức — không phải bản sửa.

Điều này khác với Content Security Policy (CSP) như thế nào?

Chúng bổ sung cho nhau. CSP kiểm soát script và resource nào được phép tải; nosniff ngăn trình duyệt phân loại sai file nó tải. Bạn muốn cả hai. nosniff đơn giản hơn và nhanh hơn để thêm, vì vậy đây là bước đầu tiên tốt trên đường đến CSP đầy đủ.