Giả mạo user-agent có thể thu hẹp tập ẩn danh và tạo ra mâu thuẫn khiến bạn dễ bị nhận diện hơn — nghịch lý entropy, và khi nào giả mạo thực sự có ích.
Đổi user-agent nghe có vẻ là một động thái bảo vệ quyền riêng tư hiển nhiên: nói với website rằng bạn đang dùng một trình duyệt khác, và nó sẽ không thể chỉ đích danh trình duyệt thật của bạn. Nhưng trên thực tế, nó thường gây ra hiệu ứng ngược lại. Một user-agent bị giả mạo có thể khiến trình duyệt của bạn hiếm hơn cả chuỗi thật mà nó thay thế, và gần như luôn mâu thuẫn với một thứ khác mà trình duyệt của bạn tiết lộ — cả hai vấn đề đó đều khiến bạn dễ bị chỉ mặt hơn, chứ không phải khó hơn. Đây không phải lý do để không bao giờ đụng vào user-agent của bạn; mà là lý do để hiểu rõ việc giả mạo thực sự thay đổi điều gì trước khi bạn dựa vào nó.
Những điểm chính
- Độ hiếm là rủi ro, không phải lời nói dối. Một user-agent giả mạo mà ít người khác dùng có thể tạo ra nhiều entropy nhận diện hơn cả chuỗi thật mà nó thay thế — xem phép toán entropy và tập ẩn danh để hiểu vì sao.
- Chuỗi này hiếm khi đi một mình. User-Agent Client Hints,
navigator.userAgentData, và hàng chục hành vi ở cấp engine vẫn tiếp tục báo cáo trình duyệt thật của bạn ngay cả sau khi chuỗi đã đổi, tạo ra một mâu thuẫn mà script có thể gắn cờ là "lời nói dối". - Việc phát hiện không cần chứng minh lời nói dối — nó chỉ cần một tín hiệu không khớp với danh tính được tuyên bố, và đó chính xác là cách các website phát hiện giả mạo user-agent ngày nay.
- Giả mạo chỉ có ích khi nó đưa bạn tới một danh tính phổ biến, nhất quán nội tại — chứ không phải một danh tính ngẫu nhiên hay khác thường.
- Đồng nhất thắng ngẫu nhiên hóa. Các công cụ khiến mọi người dùng trông giống hệt nhau sẽ thu hẹp tổng entropy của đám đông; còn các công cụ khiến một người dùng trông khác biệt so với những người còn lại thì chỉ đổi xem ai mới là người nổi bật.
Đổi user-agent thực sự thay đổi điều gì
Chuỗi user-agent là một dòng văn bản mà trình duyệt của bạn gửi đi trong mỗi yêu cầu, công bố tên, phiên bản và nền tảng của nó. Một tiện ích mở rộng hay một thiết lập trong DevTools có thể viết lại dòng đó một cách tự do — không gì ngăn bạn nói với máy chủ rằng bạn đang chạy Safari trên iPhone trong khi thực ra đang dùng Chrome trên máy tính Windows để bàn. Điều nó không thể làm là viết lại mọi thứ còn lại. Engine dựng hình, môi trường chạy JavaScript, tập header HTTP, cú bắt tay TLS, và hàng chục thuộc tính quan sát được khác vẫn tiếp tục hoạt động y hệt trình duyệt thật, vì không cái nào trong số đó đọc chuỗi bị giả mạo để quyết định cách hành xử. Bạn đã thay đổi một lời tuyên bố về danh tính của mình, trong khi một khối lượng bằng chứng lớn hơn nhiều vẫn tiếp tục khẳng định sự thật.
Nghịch lý entropy: độ hiếm mới là vấn đề, không phải lời nói dối
Chống lấy dấu vân tay không phải là che giấu thông tin — mà là không nổi bật. Như bài phân tích entropy và tập ẩn danh đã giải thích, mỗi thuộc tính mà một script có thể đọc được đóng góp một số bit entropy tỷ lệ với độ hiếm của giá trị đó: giá trị phổ biến thì "rẻ", giá trị hiếm thì "đắt", và các bit từ những tín hiệu độc lập sẽ cộng dồn lại với nhau. Nghiên cứu Panopticlick gốc của EFF đo được rằng riêng chuỗi user-agent đã đáng giá khoảng 10 bit entropy — một phần đáng kể trong khoảng ~33 bit khiến một dấu vân tay trở nên độc nhất trên Trái Đất (xem tóm tắt kết quả Panopticlick của EFF).
Có điều, con số 10 bit đó là mức đỉnh trong quá khứ chứ không phải con số của hôm nay. Việc rút gọn User-Agent của Chrome kể từ đó đã cắt chuỗi này xuống một dạng thô và gần như bị đóng băng, nên một chuỗi Chrome trung thực ngày nay mang ít entropy hơn hẳn so với năm 2010. Điều này khiến canh bạc giả mạo tệ đi chứ không khá hơn: chuỗi trung thực mà bạn định thay thế giờ rẻ một cách bất thường, còn bất kỳ giá trị nào không khớp với dạng rút gọn mà đáng lẽ nó phải có thì lại đắt một cách bất thường.
Đây chính là chỗ giả mạo đi sai hướng. Nếu bạn giả một user-agent mà rất ít khách truy cập khác dùng — một phiên bản trình duyệt lỗi thời, một bản build hệ điều hành hiếm gặp, một loại thiết bị không khớp — bạn không hề "thoát" khỏi khoản đóng góp entropy đó. Rất có thể bạn đã tăng nó lên, vì theo đúng định nghĩa, một danh tính hiếm được tuyên bố sẽ thu hẹp đám đông những người có thể là bạn. Chọn một chuỗi trình duyệt phổ biến, hiện hành, không có gì nổi bật là phiên bản giả mạo duy nhất không cộng thêm bit entropy — và ngay cả cách đó cũng chỉ hiệu quả nếu phần còn lại trong dấu vân tay của bạn không lập tức mâu thuẫn với nó, đó chính là vấn đề tiếp theo.
Phát hiện mâu thuẫn: khi câu chuyện không ăn khớp
Ngay cả một chuỗi user-agent phổ biến được chọn cẩn thận cũng phải sống sót qua việc đối chiếu với mọi thứ khác mà trình duyệt của bạn phơi bày — và chính phép đối chiếu đó là nơi hầu hết các nỗ lực giả mạo thất bại.
User-agent so với Client Hints
Các trình duyệt Chromium phơi bày User-Agent Client Hints thông qua navigator.userAgentData — một nguồn thông tin trình duyệt và nền tảng có cấu trúc, đọc được bằng script, mang cùng những sự thật có trong chuỗi user-agent nhưng được đọc qua một API hoàn toàn riêng biệt. Hầu hết công cụ giả mạo user-agent chỉ vá chuỗi đó rồi dừng lại, khiến navigator.userAgentData vẫn báo cáo đúng thương hiệu và nền tảng Chromium thật bên dưới một user-agent giờ đây tự nhận là Firefox hay Safari — những trình duyệt vốn không hề phơi bày userAgentData. Một máy chủ hay script đọc cả hai sẽ thấy một trình duyệt tự nhận là thứ này trong khi một API riêng biệt, khó giả mạo hơn, lại khẳng định nó là thứ khác. Chỉ riêng mâu thuẫn đó thường đã đủ để gắn cờ phiên truy cập, và đó là lý do nó là một trong những kỹ thuật cốt lõi được đề cập trong cách website phát hiện giả mạo user-agent.
Cờ "nói dối" và kiểm tra chéo tín hiệu
Các công cụ nghiên cứu vân tay chính thức hóa ý tưởng này một cách trực tiếp. Thay vì chỉ đọc một giá trị một lần, chúng đọc cùng một sự thật nền tảng qua nhiều đường khác nhau — một thuộc tính so với một hành vi suy ra được, một kết quả trên main thread so với cùng phép tính đó ở nơi khác — và gắn cờ bất kỳ sự bất đồng nào là một lời nói dối. Đây chính là mô hình đứng sau các dự án như CreepJS, vốn chấm điểm tính nhất quán của một trình duyệt thay vì độ độc nhất của nó (xem cách phát hiện nói dối bắt được giả mạo để hiểu cơ chế tổng quát). Một getter navigator.userAgent bị vá chính là kiểu can thiệp mà loại kiểm tra này được xây dựng để phơi bày: chuỗi nói một đằng, còn cả chục con đường khác dẫn tới cùng sự thật đó lại nói một nẻo.
Khi nào giả mạo có ích, khi nào gây hại
Tác dụng của việc giả mạo phụ thuộc hoàn toàn vào việc nó đưa bạn theo hướng nào — về phía đám đông, hay ra xa khỏi đám đông.
| Tình huống | Tác động lên tập ẩn danh của bạn |
|---|---|
| Giả mạo thành một chuỗi trình duyệt hiếm hoặc lỗi thời | Thu hẹp nó — giờ bạn khớp với một nhóm dân số nhỏ hơn, khác thường hơn |
| Giả mạo thành một chuỗi phổ biến, hiện hành, khớp với hành vi engine thật của bạn | Gần như trung lập, nếu không có gì khác mâu thuẫn với nó |
| Chỉ giả mạo chuỗi, để nguyên Client Hints / hành vi engine | Thu hẹp nó — chính sự mâu thuẫn trở thành một tín hiệu nhận diện hiếm |
| Dùng để kiểm thử/tương thích (xem giao diện di động, QA) | Ổn — bạn không cố đánh bại việc theo dõi, chỉ đang kiểm tra cách dựng hình |
| Ngẫu nhiên hóa chuỗi theo từng phiên hoặc từng site | Thu hẹp nó — một danh tính không nhất quán qua các lần truy cập tự nó là một dấu hiệu lộ |
Khuôn mẫu xuyên suốt mọi hàng đều giống nhau: giả mạo chỉ tránh được việc cộng thêm entropy khi kết quả vừa phổ biến vừa nhất quán nội tại. Bất cứ điều gì khiến bạn hiếm hơn hoặc mâu thuẫn với một tín hiệu khác đều đi ngược lại chính mục tiêu mà nó được kỳ vọng phục vụ.
Nguyên tắc hòa vào đám đông
Đây là lý do vì sao những công cụ chống lấy dấu vân tay hiệu quả nhất được xây dựng dựa trên tính đồng nhất, chứ không phải ngẫu nhiên hóa từng tín hiệu một. Chế độ resistFingerprinting của Firefox và Tor Browser không cố che giấu user-agent của bạn — chúng chuẩn hóa nó, cùng với múi giờ, kích thước màn hình và đầu ra canvas, thành cùng một tập giá trị được báo cáo trên toàn bộ cộng đồng người dùng của mình. Nếu tất cả mọi người dùng chế độ đó đều báo cáo một tập giá trị giống hệt nhau, thì tập giá trị đó mang gần như bằng 0 bit entropy, bất kể nó so với cấu hình "thật" bên dưới ra sao. Ngược lại, tự mình ngẫu nhiên hóa một tín hiệu đơn lẻ có thể phản tác dụng giống hệt như việc giả mạo: một hash canvas ngẫu nhiên một cách kỳ lạ hay một user-agent đổi khác giữa các lần truy cập tự nó là một khuôn mẫu có thể bị phát hiện, một vấn đề được phân tích sâu trong Canvas Noise vs Hash Thật: Vì Sao Randomization Phản Tác Dụng. Bài học này vượt ra ngoài canvas: thay đổi một tín hiệu đơn lẻ một cách cô lập, mà không có một đám đông lớn cùng làm y hệt như vậy, thường chỉ đánh đổi một dạng lộ diện này lấy một dạng khác.
Tự kiểm tra trình duyệt của bạn
Bạn không cần tin suông vào bất kỳ điều gì ở trên — bạn có thể tự mình nhìn thấy sự mâu thuẫn. Giả mạo user-agent bằng một tiện ích mở rộng hoặc mô phỏng thiết bị trong DevTools, sau đó mở console và so sánh navigator.userAgent với navigator.userAgentData: trên Chromium, cái thứ hai vẫn tiếp tục báo cáo trình duyệt thật của bạn bất kể cái đầu tiên giờ tuyên bố gì. Công cụ kiểm tra dấu vân tay của BrowserInsight cho thấy toàn bộ tập tín hiệu mà một script có thể kết hợp, và công cụ kiểm tra nhân trình duyệt so sánh trực tiếp danh tính được tuyên bố của bạn với engine dựng hình thực tế. Để có một so sánh trước/sau toàn diện hơn về tập ẩn danh của bạn, công cụ Cover Your Tracks của EFF báo cáo một ước tính dạng 1-trên-X dựa trên tập dữ liệu tổng hợp riêng của nó — hãy chạy nó cả khi bật và tắt công cụ giả mạo của bạn để xem nó thực sự đã đưa bạn theo hướng nào.
Câu hỏi thường gặp
Vậy tôi có nên không bao giờ đổi user-agent?
Không phải là không bao giờ — chỉ là đừng dùng nó như một công cụ bảo vệ quyền riêng tư đơn độc. Giả mạo để kiểm thử tương thích hay xem giao diện di động thì vẫn ổn, vì bạn không cố đánh bại việc theo dõi. Nhưng như một biện pháp bảo vệ quyền riêng tư, một chuỗi giả mạo đơn lẻ mà không đi kèm Client Hints và hành vi engine tương ứng thường sẽ cộng thêm entropy nhận diện thay vì loại bỏ nó.
Vậy có phải các tiện ích bảo vệ quyền riêng tư làm đổi user-agent đều tệ?
Không hẳn — điều đó phụ thuộc vào việc chúng có thay đổi toàn bộ danh tính một cách nhất quán hay không. Một công cụ được xây dựng tốt sẽ phối hợp user-agent, Client Hints và các tín hiệu liên quan với nhau, hướng tới một cấu hình phổ biến, được nhiều người dùng chung. Một công cụ chỉ vá riêng chuỗi, hoặc ngẫu nhiên hóa nó theo từng lần truy cập, có xu hướng khiến mọi thứ tệ hơn đúng theo những cách đã mô tả ở trên.
Nghịch lý entropy dấu vân tay có phải chỉ riêng với giả mạo user-agent?
Không — nó áp dụng cho bất kỳ tín hiệu nào. Ngẫu nhiên hóa một hash canvas, một độ phân giải màn hình, hay một danh sách phông chữ đều có cùng kiểu thất bại nếu giá trị được ngẫu nhiên hóa đó hiếm hoặc không nhất quán với mọi thứ khác. User-agent chỉ đơn giản là tín hiệu mà hầu hết mọi người nghĩ đến đầu tiên, và cũng là tín hiệu dễ bị giả mạo sai nhất.
Nếu không phải giả mạo, điều gì thực sự làm giảm dấu vân tay của tôi?
Chuẩn hóa, chứ không phải ngụy trang. Các trình duyệt và chế độ được xây dựng để khiến số lượng lớn người dùng báo cáo cùng những giá trị giống hệt nhau — Tor Browser, resistFingerprinting của Firefox — thực sự làm giảm entropy trung bình của mỗi người dùng, vì đám đông mà bạn hòa vào là có thật và đông đảo. Xem hướng dẫn đầy đủ về dấu vân tay trình duyệt để biết toàn bộ tập tín hiệu mà các công cụ này phải phối hợp.
Kết luận
Chuỗi user-agent chỉ là một dòng trong số hàng chục tín hiệu, và thay đổi nó một cách cô lập không loại bỏ thông tin — nó chỉ tạo thêm một tín hiệu mới: liệu lời tuyên bố đó có ăn khớp với mọi thứ còn lại hay không. Một danh tính giả mạo hiếm tự nó đã thu hẹp tập ẩn danh của bạn; một danh tính không nhất quán thì trao ngay cho bên phát hiện một dấu hiệu quá dễ thấy. Những phiên bản "giả mạo" thực sự có ích là những phiên bản không còn trông giống giả mạo chút nào nữa — khớp với một cấu hình lớn, phổ biến, nhất quán nội tại, cùng nguyên tắc đứng sau mọi công cụ chống lấy dấu vân tay thực sự hiệu quả.
Đọc thêm:


