Chương trình rút gọn User-Agent của Chrome đóng băng phiên bản phụ, hệ điều hành và model thiết bị trong chuỗi UA. Đây là những gì đã đổi.
Nếu chuỗi User-Agent của Chrome báo Chrome/143.0.0.0, trong khi chrome://version cho thấy bản build bạn đang chạy thực ra là dạng bốn phần như 143.0.7499.96, thì bạn không đọc nhầm bên nào cả — Chrome thực sự đã ngừng báo cáo phiên bản chính xác của nó. Đây không phải lỗi. Đó là kết quả có chủ đích của chương trình User-Agent Reduction (Rút gọn User-Agent) của Chrome: một nỗ lực kéo dài nhiều năm nhằm cắt gọn chuỗi UA vốn được phát sóng thụ động xuống còn một stub ít chi tiết, đồng thời chuyển các thông tin cụ thể sang một API chỉ tiết lộ khi được yêu cầu. Dưới đây là chính xác những gì đã bị loại bỏ, thứ thay thế nó, và ý nghĩa của các giá trị bị đóng băng này đối với việc phát hiện giả mạo.
Tóm tắt nhanh
- Rút gọn User-Agent của Chrome loại bỏ ba thứ khỏi chuỗi UA: phiên bản phụ/build/patch, phiên bản hệ điều hành chính xác, và model thiết bị.
- Mọi thứ sau phiên bản chính giờ luôn là
0.0.0— mọi bản build Chrome 143 đều báoChrome/143.0.0.0, bất kể thực tế là bản vá nào. Chuỗi hệ điều hành trên desktop cũng bị đóng băng thành các giá trị cố định, ví dụWindows NT 10.0cho mọi phiên bản Windows kể từ Windows 10. - Model thiết bị Android được thay bằng ký hiệu chung
K, và phiên bản Android báo cáo cũng bị đóng băng ở mức10, bất kể thiết bị và bản build hệ điều hành thực tế. - Chi tiết bị loại bỏ không biến mất — nó chuyển sang User-Agent Client Hints (UA-CH), chỉ tiết lộ khi máy chủ yêu cầu rõ ràng.
- Vì UA bị đóng băng không còn thay đổi theo các bản cập nhật thực tế, việc nó không khớp với phiên bản engine thực sự được phát hiện qua feature-detection trở thành tín hiệu giả mạo mạnh hơn, chứ không yếu đi.
Chính xác những gì đã bị loại bỏ
Theo tài liệu tham khảo về rút gọn User-Agent của MDN, việc rút gọn của Chrome nhắm đúng vào ba trường:
- Phiên bản nền tảng/hệ điều hành chính xác — không còn là phiên bản Windows thật, bản macOS cụ thể, hay phiên bản Android thật của bạn.
- Model thiết bị — chuỗi model điện thoại/máy tính bảng Android bị loại bỏ.
- Phiên bản phụ của trình duyệt — chỉ phiên bản chính còn có ý nghĩa; mọi thứ sau nó đều bị đưa về 0.
Các giá trị thay thế là cố định, không phải gần đúng — mọi thiết bị trên cùng một nền tảng đều báo cáo cùng một chuỗi:
| Nền tảng | Giá trị bị đóng băng |
|---|---|
| Windows | Windows NT 10.0; Win64; x64 (cả Windows 10 lẫn 11) |
| macOS | Macintosh; Intel Mac OS X 10_15_7 |
| Linux | X11; Linux x86_64 |
| ChromeOS | X11; CrOS x86_64 14541.0.0 |
| Android | Android 10; K (model thiết bị thật được thay bằng chữ cái K) |
Một ví dụ so sánh trước/sau thực tế sẽ làm rõ hiệu ứng này. Trước đây, UA thật của Chrome trên Android trông như thế này:
Mozilla/5.0 (Linux; Android 16; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.96 Mobile Safari/537.36
Sau khi rút gọn, cùng thiết bị đó báo cáo như sau:
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36
Phiên bản Android 16 thật và tên model Pixel 9 đều biến mất, còn phần đứng sau phiên bản chính — 0.7499.96 — bị thu về 0.0.0. Phiên bản chính (143) vẫn được giữ lại, vì các website thực sự cần nó để phân nhánh xử lý tương thích: đây là chi tiết phiên bản duy nhất vẫn còn được phát sóng thụ động, và nó vẫn tăng lên mỗi khi Chrome cập nhật.
Vì sao Google chọn đóng băng thay vì xóa hẳn
Thông báo gốc năm 2021 trên Chromium Blog chỉ ra hai khiếm khuyết riêng biệt của chuỗi UA: nó thụ động tiết lộ rất nhiều thông tin định danh trên mỗi yêu cầu bất kể có script nào hỏi hay không, và định dạng tự do, thiếu cấu trúc của nó khiến nó trở thành gánh nặng bảo trì — các trình duyệt không thể an toàn thay đổi nó vì nhiều website dựa vào việc khớp mẫu chuỗi con trong đó. Xóa hẳn các trường này ngay lập tức sẽ làm hỏng mọi script dựa vào việc dò UA. Đóng băng chúng thành các giá trị cố định, dùng chung cho tất cả lại giữ nguyên định dạng của chuỗi (các bộ phân tích cũ không bị lỗi), trong khi khiến các giá trị cụ thể trở nên vô dụng như một tín hiệu định danh, vì giờ đây hàng triệu thiết bị không liên quan phát ra cùng một chuỗi giống hệt nhau đến từng byte.
Việc triển khai được cố tình kéo dài qua rất nhiều phiên bản Chrome — origin trial trước, rồi loại bỏ dần theo từng giai đoạn, desktop đi trước và Android theo sau — chính là để các website phụ thuộc vào dữ liệu UA chi tiết (model thiết bị, bản build hệ điều hành chính xác, phiên bản phụ chính xác) có đủ thời gian di chuyển sang phương án thay thế rõ ràng trước khi hành vi cũ biến mất hoàn toàn.
Chi tiết bị loại bỏ đã chuyển đi đâu
Không có gì bị vứt bỏ hoàn toàn — Chrome đã xây dựng một kênh song song riêng cho chính loại thông tin này: User-Agent Client Hints (UA-CH). Trong khi UA cũ phát sóng mọi thứ theo mặc định, UA-CH đảo ngược mô hình này: một tập nhỏ các gợi ý entropy thấp (thương hiệu, cờ di động, tên nền tảng) vẫn được gửi tự động, nhưng dữ liệu entropy cao bị loại bỏ khi rút gọn — số phiên bản đầy đủ, phiên bản hệ điều hành chính xác, model thiết bị — giờ chỉ được tiết lộ khi máy chủ gửi header Accept-CH yêu cầu rõ ràng, và được đọc phía client qua navigator.userAgentData.getHighEntropyValues(). Thông tin vẫn tồn tại; chỉ là nó không còn được tự nguyện cung cấp cho bất kỳ máy chủ nào không hề hỏi.
Vì sao các website và script bị hỏng
Bất kỳ đoạn mã nào phân tích chuỗi UA để lấy chi tiết vượt ra ngoài mức "trình duyệt nào, phiên bản chính đại khái nào, di động hay desktop" giờ đều nhận được câu trả lời lỗi thời hoặc sai. Các thư viện phát hiện thiết bị từng phân nhánh theo chuỗi model Android, công cụ phân tích từng ghi lại số bản build hệ điều hành chính xác, hay công cụ QA từng tin vào navigator.userAgent để kiểm tra phiên bản chính xác — tất cả đều âm thầm xuống cấp: chúng không báo lỗi, mà chỉ lặng lẽ bắt đầu trả về 0.0.0 và K cho mọi người dùng. Đó chính là sự đánh đổi: một lợi ích quyền riêng tư thực sự (bề mặt lấy dấu vân tay thụ động giảm đáng kể trên mỗi yêu cầu) được trả giá bằng nợ kỹ thuật về tương thích, đổ lên vai bất kỳ ai chưa kịp di chuyển sang UA-CH.
Góc độ phát hiện: UA bị đóng băng nói ít hơn, theo cả hai chiều
Đối với việc lấy dấu vân tay và phát hiện giả mạo, rút gọn tạo ra một hiệu ứng phụ thú vị. Trước đây, phiên bản vá của UA tiến lên cùng mỗi bản cập nhật thực tế, nên một phiên bản khai báo rõ ràng lỗi thời từng là một dấu hiệu (dù yếu). Giờ đây, UA đã rút gọn lẽ ra phải trông tĩnh — phần đuôi 0.0.0 đứng yên giữa các bản vá là hoàn toàn bình thường, và chỉ nhìn vào chuỗi thì một bản mới cài với một bản nhiều tháng chưa cập nhật là không thể phân biệt. Điều đó loại bỏ một tín hiệu yếu, nhưng không loại bỏ những tín hiệu thực sự quan trọng: một trang vẫn có thể hỏi engine JavaScript, thông qua feature-detection, engine render và phiên bản nào nó thực sự đang chạy, hoàn toàn độc lập với những gì chuỗi UA đã đóng băng khai báo. Nếu UA của một trình duyệt khai báo là Chrome 143, nhưng phiên bản engine thực sự, được phát hiện qua feature-detection, rõ ràng cũ hơn, mới hơn — hoặc thuộc hẳn về một họ engine khác — thì đó chính xác là loại mâu thuẫn được đề cập trong bài cách phát hiện giả mạo user-agent. Công cụ kiểm tra nhân trình duyệt của BrowserInsight chạy đúng phép thử feature-detection đó và hiển thị song song với UA bạn khai báo, để bạn thấy trực tiếp liệu hai bên có khớp nhau không.
Tự kiểm tra
Mở DevTools và chạy navigator.userAgent. Nếu bạn đang dùng Chrome bản gần đây (hoặc bất kỳ trình duyệt Chromium hiện đại nào), bạn sẽ thấy mọi thứ sau phiên bản chính đều là 0.0.0 — đối chiếu với số build bốn phần trên chrome://version, bạn sẽ thấy chính xác phần nào đã bị giữ lại. Trên Android, kiểm tra xem token thiết bị có hiển thị là K thay vì tên model thật hay không. Sau đó so sánh với phiên bản engine thực sự của bạn bằng công cụ kiểm tra nhân trình duyệt của BrowserInsight — công cụ này phát hiện engine render thật của bạn hoàn toàn độc lập với những gì chuỗi UA (giờ đã bị đóng băng) khai báo.
Câu hỏi thường gặp
Firefox và Safari có đóng băng chuỗi User-Agent của họ không?
Không, rút gọn là chương trình riêng của Chromium; Firefox và Safari vẫn gửi chuỗi UA truyền thống, chưa rút gọn. Chỉ các trình duyệt dựa trên Chromium (Chrome, Edge, Brave, Opera và những trình duyệt khác cùng nền) mới áp dụng các giá trị bị đóng băng nêu trong bài này.
User-Agent Reduction có áp dụng cho Chrome trên iOS không?
Không. Chrome trên iOS bắt buộc phải dùng engine WebKit của Apple thay vì engine Blink của riêng Chromium, và việc rút gọn chỉ giới hạn trong Chrome chạy Blink — nó không áp dụng cho Chrome for iOS hay Android WebView, cả hai vẫn giữ chuỗi UA truyền thống.
Website của tôi có bị hỏng vì điều này không?
Chỉ khi nó đọc trực tiếp các trường UA chi tiết — bản build hệ điều hành chính xác, model thiết bị, hoặc phiên bản phụ của trình duyệt — từ navigator.userAgent hoặc header HTTP. Nếu vậy, hãy chuyển sang User-Agent Client Hints, vốn vẫn cung cấp những chi tiết đó khi được yêu cầu rõ ràng. Mã chỉ kiểm tra họ trình duyệt và phiên bản chính thì không bị ảnh hưởng.
Phiên bản 0.0.0 bị đóng băng tự nó có đáng ngờ không?
Không — đó là giá trị mặc định dự kiến cho mọi trình duyệt Chromium thật, cập nhật ngày nay, tự nó không mang tín hiệu gì. Điều đáng ngờ là khi UA bị đóng băng không khớp với các tín hiệu được phát hiện độc lập khác — chẳng hạn phiên bản engine thực sự được phát hiện qua feature-detection, hoặc dữ liệu client hints của trình duyệt.
Kết luận
Rút gọn User-Agent là một sự đánh đổi âm thầm nhưng có chủ đích: Chrome giữ nguyên định dạng của chuỗi UA để không gây đổ vỡ thảm khốc, trong khi thay thế mọi giá trị cụ thể, có tính định danh bên trong nó bằng một vài chuỗi cố định dùng chung cho hàng triệu thiết bị. Chi tiết không hề biến mất — nó chuyển sang User-Agent Client Hints, một API chỉ tiết lộ thông tin khi được yêu cầu rõ ràng. Với những ai làm việc về lấy dấu vân tay hay phân tích giả mạo, kết luận thực tế là: bản thân chuỗi UA giờ gần như không còn đáng để tin cậy một mình; điều quan trọng là nó có khớp với các tín hiệu mà một trình duyệt thật khó có thể giả mạo dễ dàng hay không.
Đề xuất đọc thêm:

