Lấy dấu vân tay phông chữ nhận diện bạn qua các phông đã cài trên thiết bị. Tìm hiểu cách liệt kê và đo phông hoạt động — và cách giảm những gì bạn để lộ.
Lấy dấu vân tay phông chữ nhận diện thiết bị của bạn dựa trên tập hợp các phông chữ đã cài đặt trên đó. Tổ hợp phông chữ cụ thể mà bạn có — được định hình bởi hệ điều hành, phần mềm đã cài, các gói ngôn ngữ và công cụ thiết kế — đặc trưng đến mức bất ngờ, và một trang web có thể phát hiện tổ hợp đó từ JavaScript mà không cần bất kỳ quyền đặc biệt nào. Bài viết này giải thích cách liệt kê và đo phông chữ hoạt động, vì sao kết quả lại định danh đến vậy, và cách giảm những gì bạn để lộ.
Tóm tắt nhanh
- Không có API không cần quyền nào liệt kê phông của bạn; các bên theo dõi suy ra chúng bằng cách kết xuất văn bản và đo cách trình duyệt thay thế bằng phông dự phòng khi phông được yêu cầu không có.
- Vài trăm phép dò "có mặt/vắng mặt" kết hợp lại thành một hồ sơ entropy cao, vì bộ phông phản ánh hệ điều hành, ứng dụng đã cài và các gói ngôn ngữ của bạn.
- Kỹ thuật này không cần quyền và sống sót qua việc xóa cookie hay dùng chế độ riêng tư, bởi nó được suy ra từ hành vi kết xuất chứ không phải dữ liệu được lưu.
- API mới hơn
queryLocalFonts()có thể liệt kê phông thật nhưng bị chặn sau một lời nhắc xin quyền tường minh, nên đó không phải là vector im lặng mà các bên theo dõi dựa vào. - Phòng vệ tốt nhất là sự đồng nhất: các trình duyệt như Tor Browser chuẩn hóa bộ phông hiển thị để mọi người trông giống nhau, thay vì thêm phông tùy chỉnh.
Lấy dấu vân tay phông chữ là gì?
Lấy dấu vân tay phông chữ là việc xác định những phông nào được cài trên hệ thống của bạn và dùng danh sách đó như một phần của mã định danh thiết bị. Bộ phông của bạn hiếm khi là điều bạn để tâm đến, nhưng nó mang entropy thực sự: một bản cài Windows mặc định, một máy Mac có các ứng dụng Adobe, và một máy Linux với công cụ lập trình đều mang theo những bộ sưu tập phông khác biệt rõ rệt.
Các trang web không thể đơn giản hỏi "bạn có những phông nào?" — không có API trực tiếp nào trả về toàn bộ danh sách. Thay vào đó chúng suy ra nó bằng cách thử các phông cụ thể và quan sát cách văn bản được kết xuất. Giống như lấy dấu vân tay canvas và âm thanh, nó dựa vào những khác biệt kết xuất có thể đo được chứ không phải dữ liệu được lưu, nên nó sống sót qua việc xóa cookie. Các công cụ nghiên cứu quyền riêng tư như Cover Your Tracks của EFF cho thấy các tín hiệu thụ động này đặc trưng đến mức nào khi được kết hợp với nhau.
Cách phát hiện phông chữ hoạt động
Kỹ thuật cổ điển là đo phông dự phòng. Khi một trình duyệt được yêu cầu kết xuất văn bản bằng một phông chưa được cài, nó âm thầm thay thế bằng một phông mặc định — và phông thay thế gần như luôn có kích thước chữ cái khác. Bằng cách đo những kích thước đó, một script có thể biết phông được yêu cầu có thực sự hiện diện hay không.
Phương pháp này hoạt động như sau:
- Đo một mốc cơ bản. Kết xuất một chuỗi thử bằng các phông chung đã biết (
monospace,sans-serif,serif) và ghi lại chính xác chiều rộng và chiều cao. - Yêu cầu một phông ứng viên. Kết xuất cùng chuỗi đó nhưng yêu cầu một phông cụ thể (ví dụ "Calibri") với một phông dự phòng chung.
- So sánh. Nếu kích thước khác với mốc dự phòng, phông ứng viên đã được cài; nếu chúng khớp với phông dự phòng thì chưa.
- Lặp lại. Chạy qua một danh sách hàng trăm phông phổ biến để xây dựng một hồ sơ có mặt/vắng mặt.
// Phát hiện liệu một phông cụ thể có được cài thông qua đo phông dự phòng
function isFontInstalled(font) {
const baseFont = 'monospace';
const text = 'mmmmmmmmmmlli';
const span = document.createElement('span');
span.style.fontSize = '72px';
span.style.position = 'absolute';
span.style.left = '-9999px';
span.textContent = text;
document.body.appendChild(span);
span.style.fontFamily = baseFont;
const baseWidth = span.offsetWidth;
// Yêu cầu phông ứng viên với phông cơ sở làm dự phòng
span.style.fontFamily = `'${font}', ${baseFont}`;
const testWidth = span.offsetWidth;
document.body.removeChild(span);
return testWidth !== baseWidth; // chiều rộng khác nhau => phông có mặt
}
Các biến thể hiện đại dùng Canvas API để đo văn bản chính xác hơn. Thay vì đọc kích thước hộp của phần tử, một script vẽ chuỗi thử lên một canvas bằng measureText() và kiểm tra các thông số glyph trả về — vốn có thể khác nhau ngay cả khi hai phông tình cờ có cùng chiều rộng tiến (advance width), khiến việc phát hiện đáng tin cậy hơn và khó bị các biện pháp phòng vệ thô sơ đánh lừa hơn.
Liệt kê so với Local Font Access API
Việc tách bạch hai khả năng khác biệt sẽ hữu ích:
| Cách tiếp cận | Quyền | Tiết lộ điều gì |
|---|---|---|
| Đo phông dự phòng / canvas | Không cần | Sự có mặt hoặc vắng mặt của từng phông bạn dò cụ thể, mỗi lần một phông |
queryLocalFonts() | Lời nhắc tường minh | Danh sách đầy đủ các kiểu phông đã cài, gồm cả tên PostScript và tên họ phông |
Cách thứ nhất chỉ có thể trả lời "phông này có được cài không?" cho những phông mà script đã nghĩ đến để thử, nên các bên theo dõi mang theo một danh sách được tuyển chọn gồm vài trăm họ phông phổ biến. Cách thứ hai — Local Font Access API, có trong các trình duyệt nền Chromium — trả về toàn bộ tập phông cục bộ chỉ trong một lệnh gọi, nhưng chỉ sau khi người dùng cấp quyền local-fonts. Vì lời nhắc đó nổi bật và dễ bị từ chối, các bên theo dõi lén lút hiếm khi dùng nó; phương pháp đo phông dự phòng im lặng vẫn là công cụ chủ lực của việc lấy dấu vân tay phông chữ.
Vì sao danh sách phông của bạn lại định danh đến vậy
Bộ phông tích lũy từ nhiều nguồn, và chính sự đa dạng đó là điều khiến chúng hữu ích cho việc theo dõi:
- Hệ điều hành và phiên bản đi kèm các phông mặc định khác nhau.
- Các ứng dụng đã cài — Microsoft Office, Adobe Creative Cloud và các công cụ thiết kế — thêm các họ phông đặc trưng.
- Các gói ngôn ngữ và khu vực thêm các hệ chữ (CJK, Cyrillic, Arabic) mà nhiều hệ thống không có.
- Các phông được cài thủ công từ các nhà thiết kế và lập trình viên rất mang tính cá nhân.
Mỗi câu trả lời có-cài-hay-không là một bit entropy, và vài trăm phép dò kết hợp lại thành một hồ sơ đủ đặc trưng để tách riêng nhiều người dùng — đặc biệt khi kết hợp với các tín hiệu khác.
Lấy dấu vân tay phông chữ trong bức tranh lớn hơn
Lấy dấu vân tay phông chữ hiếm khi hoạt động một mình. Nó là một lớp trong một ngăn xếp bao gồm canvas, WebGL, âm thanh, thông số màn hình và dữ liệu user-agent. Cũng có sự chồng lấn với các add-on trình duyệt: một số tiện ích mở rộng chèn phông riêng của chúng hoặc thay đổi hành vi phông, điều này có thể khiến bạn dễ nhận diện hơn chứ không phải khó hơn. Hiểu toàn bộ bức tranh chính là mục đích của hướng dẫn về lấy dấu vân tay trình duyệt của chúng tôi.
Cách giảm dấu vân tay phông chữ của bạn
- Dùng một trình duyệt hạn chế việc liệt kê phông. Tor Browser giới hạn các trang web trong một bộ phông tiêu chuẩn để mọi người trông giống nhau; chế độ chống lấy dấu vân tay của Firefox cũng làm điều tương tự. Brave áp dụng ngẫu nhiên hóa.
- Tránh cài các phông bất thường trong hồ sơ trình duyệt bạn dùng cho việc duyệt web nhạy cảm về quyền riêng tư — bộ phông của bạn càng hiếm, bạn càng độc nhất.
- Cảnh giác với các tiện ích chèn phông, vốn có thể mở rộng danh sách phông có thể phát hiện của bạn.
- Biết rõ giới hạn. Như với các kỹ thuật khác, chế độ riêng tư/ẩn danh không ngăn được việc lấy dấu vân tay phông chữ; nó chỉ xóa cookie và lịch sử.
Bài học phản trực giác là sự đồng nhất mới bảo vệ bạn: mục tiêu là trông giống mọi người khác, chứ không phải thêm nhiều phông tùy chỉnh hơn.
Các biện pháp phòng vệ mạnh nhất thực sự hoạt động ra sao
Các công cụ hiệu quả nhất không hẳn là che giấu phông của bạn mà là san phẳng sự khác biệt giữa những người dùng:
- Chuẩn hóa. Tor Browser đi kèm một bộ phông cố định và báo cho các trang web rằng chỉ tồn tại những phông đó, bất kể thực tế đã cài gì. Do đó mỗi người dùng Tor đều báo cáo cùng một bộ phông, nén entropy của tín hiệu này xuống gần bằng không. Chế độ
privacy.resistFingerprintingcủa Firefox áp dụng cùng triết lý. - Ngẫu nhiên hóa. Brave làm nhiễu nhẹ các giá trị đo được và thay đổi theo từng phiên, nên các phép dò lặp lại không trả về một câu trả lời ổn định. Điều này phá vỡ khả năng liên kết giữa các lần truy cập vốn khiến một dấu vân tay trở nên hữu ích, ngay cả khi một ảnh chụp đơn lẻ vẫn trông hợp lý.
- Giảm bề mặt phơi nhiễm. Ngoài các trình duyệt được gia cố, hãy giữ một hồ sơ sạch cho việc duyệt web nhạy cảm về quyền riêng tư: tránh cài các họ phông kỳ lạ, và gỡ bỏ các tiện ích chèn phông. Một bản cài hệ điều hành nguyên gốc ít độc nhất hơn nhiều so với một bản chất đầy phần mềm thiết kế.
Không một công tắc đơn lẻ nào loại bỏ được việc lấy dấu vân tay phông chữ, và mục tiêu thực tế là kết hợp một trình duyệt được gia cố với một bộ phông tối thiểu. Về mô hình mối đe dọa rộng hơn — cách phông kết hợp với các tín hiệu khác — W3C ghi nhận việc lấy dấu vân tay là một mối lo ngại quyền riêng tư được công nhận trong hướng dẫn nền tảng web của mình.
Câu hỏi thường gặp
Một trang web có thể thấy trực tiếp tất cả phông đã cài của tôi không?
Không nếu không có quyền. Không có API không cần quyền nào liệt kê mọi phông. Các trang web suy ra phông của bạn bằng cách kết xuất văn bản và đo sự thay thế dự phòng, vốn để lộ sự có mặt hoặc vắng mặt của từng phông một. API mới hơn queryLocalFonts() có thể liệt kê phông nhưng yêu cầu một lời nhắc xin quyền tường minh.
Lấy dấu vân tay phông chữ có cần quyền nào không?
Không. Phương pháp đo phông dự phòng dùng việc kết xuất văn bản thông thường và đo kích thước phần tử, vốn không cần quyền và không kích hoạt lời nhắc nào. Đó là điều khiến nó hấp dẫn với các bên theo dõi và khó để người dùng nhận ra.
Xóa cookie có loại bỏ dấu vân tay phông chữ của tôi không?
Không. Dấu vân tay được suy ra từ những phông nào được cài, chứ không phải từ dữ liệu được lưu, nên xóa cookie hoặc dùng chế độ riêng tư không làm thay đổi nó. Giảm nó đòi hỏi hạn chế việc liệt kê phông ở cấp trình duyệt.
Làm sao để kiểm tra những gì trình duyệt của tôi để lộ?
Hãy chạy công cụ kiểm tra dấu vân tay của BrowserInsight để xem các tín hiệu mà trình duyệt của bạn rò rỉ, và kiểm tra plugin và tiện ích mở rộng để rà soát các add-on có thể ảnh hưởng đến hồ sơ phông của bạn.
Kết luận
Lấy dấu vân tay phông chữ đọc tổ hợp độc nhất các phông mà hệ thống của bạn đã tích lũy và biến nó thành một mã định danh ổn định — không cần quyền, không cần micro, không cần dữ liệu được lưu. Vì các bộ phông phản ánh hệ điều hành, ứng dụng và thói quen của bạn, chúng mang entropy thực sự, đặc biệt là bên cạnh các tín hiệu canvas, WebGL và âm thanh. Biện pháp phòng vệ hiệu quả không phải là thêm nhiều phông mà là hòa lẫn vào đám đông: hãy dùng một trình duyệt chuẩn hóa hoặc ngẫu nhiên hóa việc liệt kê phông, và giữ cho hồ sơ riêng tư của bạn ở mức bình thường.
Bài viết nên đọc: