Cửa sổ riêng tư không chỉ ẩn lịch sử — nó còn thay đổi cách API lưu trữ hoạt động, và đó chính là điều website dùng để phát hiện chế độ ẩn danh.
Cửa sổ ẩn danh (Incognito) và duyệt web riêng tư hứa hẹn rằng một trang web sẽ không thể biết bạn đã từng ghé qua đó. Nhưng chúng không hứa rằng trang web không thể biết bạn hiện đang ở trong một cửa sổ như vậy — và trong suốt một thập kỷ, các nhà xuất bản, mạng quảng cáo và công cụ chống gian lận đã khai thác đúng khoảng trống đó. Vì một cửa sổ riêng tư buộc phải hoạt động khác đi ở tầng bên dưới — giới hạn lưu trữ khác, hành vi ghi đĩa khác — một script dò các khác biệt đó thường có thể kết luận "đây là một cửa sổ riêng tư" với độ tin cậy thực sự, mà không cần đọc một cookie nào.
Tóm tắt nhanh
- Duyệt web riêng tư ẩn lịch sử, không ẩn hành vi — các API lưu trữ như
navigator.storage.estimate()vẫn báo cáo những khác biệt thật, có thể đo được giữa phiên thông thường và phiên riêng tư. - Thủ thuật lâu đời nhất của Chromium là đo tốc độ ghi vào FileSystem API (nay đã bị loại bỏ) — API này chạy trong bộ nhớ khi ở chế độ Incognito và nhanh hơn khoảng 3–4 lần so với việc ghi đĩa thật ở chế độ thông thường.
- Sau khi Chrome vá lỗ hổng đó vào năm 2019, các script phát hiện chuyển hướng sang hạn mức lưu trữ mà Chrome báo cáo qua
navigator.storage.estimate()— nhỏ hơn và đồng đều hơn trong Incognito, lớn hơn và tỷ lệ thuận với dung lượng đĩa ở chế độ thông thường. - Kể từ đó, Chrome đã bắt đầu báo cáo một hạn mức cố định, "có thể dự đoán được" ở mọi chế độ, với mục đích rõ ràng là triệt tiêu phương pháp suy đoán đó — một bản sửa đang được triển khai chứ chưa hoàn tất.
- Firefox và Safari cũng có lịch sử riêng về các dấu hiệu lộ chế độ riêng tư, chủ yếu xoay quanh việc
localStoragevàIndexedDBhoạt động khác đi (hoặc thất bại hoàn toàn) trong một phiên riêng tư. - Công cụ kiểm tra dấu vân tay của BrowserInsight hiển thị các tín hiệu lưu trữ, canvas và nhiều tín hiệu khác mà trình duyệt của bạn đang để lộ, bất kể có ở cửa sổ riêng tư hay không.
Vì sao website bận tâm phát hiện chế độ ẩn danh
Hai động cơ chính đều mang tính thương mại, chứ không phải đối kháng theo nghĩa bảo mật. Các nhà xuất bản dùng paywall đo lượng đọc — nổi tiếng nhất là New York Times — sử dụng việc phát hiện Incognito để ngăn độc giả reset số lượng bài đọc miễn phí bằng cách mở một cửa sổ riêng tư mới mỗi lần. Các công cụ ad-tech và chống gian lận dùng nó như một tín hiệu bổ sung: một tỷ lệ lưu lượng truy cập từ cửa sổ riêng tư cao bất thường có tương quan với các trang trại click gian lận quảng cáo và lạm dụng mã khuyến mãi/coupon, nên việc gắn cờ tín hiệu này góp phần vào một điểm rủi ro tổng thể rộng hơn, giống cách hệ thống phát hiện bot kết hợp nhiều tín hiệu yếu thay vì chỉ tin vào một tín hiệu duy nhất.
Cả hai trường hợp sử dụng đều không cần xác định bạn là ai — chỉ cần biết cửa sổ bạn đang dùng ngay lúc này có phải là cửa sổ riêng tư hay không. Mục tiêu hẹp hơn đó chính là điều làm kỹ thuật này khác với lấy dấu vân tay trình duyệt: nó không cố xây dựng một định danh lâu bền, mà chỉ trả lời một câu hỏi có/không trong suốt thời gian tải trang.
Thủ thuật đo tốc độ ghi FileSystem
Kỹ thuật phát hiện Incognito đáng tin cậy sớm nhất nhắm vào cách Chrome triển khai File and Directory Entries API (nay đã bị loại bỏ, chỉ tồn tại trên Chromium) — window.webkitRequestFileSystem và các API liên quan. Ở cửa sổ thông thường, Chrome hậu thuẫn API này bằng các file thật trên đĩa. Ở chế độ Incognito, để không để lại dấu vết nào sau khi cửa sổ đóng lại, Chrome thay vào đó dùng một hệ thống file ảo nằm trong bộ nhớ.
Bộ nhớ nhanh hơn đĩa cứng rất nhiều, nên một script có thể ghi một loạt file tạm, đo thời gian ghi mất bao lâu, và nhận về một tín hiệu rõ ràng: nếu việc ghi hoàn tất nhanh hơn ba đến bốn lần so với mốc chuẩn ở chế độ thông thường, nghĩa là hệ thống file chưa từng chạm vào đĩa, tức là cửa sổ đó đang ở chế độ riêng tư. Không cần lời nhắc xin quyền, không cần tương tác của người dùng — chỉ là một phép đo thời gian trên một API mà, vào thời điểm đó, được để lộ ra theo mặc định.
Chrome đã vá lỗ hổng cụ thể này trong phiên bản 76 (2019), chuyển việc triển khai FileSystem của Incognito sang ghi vào đĩa thay vì bộ nhớ, qua đó xóa bỏ khoảng cách về thời gian. Đây là phản ứng trực tiếp trước việc kỹ thuật phát hiện paywall thu hút sự chú ý của báo chí chính thống — một bản vá lỗ hổng thật sự, không phải một bản sửa mang tính hình thức.
Thủ thuật hạn mức StorageManager
Bản vá đó không chấm dứt trò mèo vờn chuột; nó chỉ chuyển trò chơi sang một API khác. Mọi trình duyệt hiện đại đều cung cấp navigator.storage.estimate(), một phần của Storage API, trả về một promise phân giải thành usage (dung lượng lưu trữ hiện tại) và quota (hạn mức khả dụng) cho origin đó:
// Illustrative sketch — not the exact detectIncognito heuristic
async function looksLikeIncognito() {
const { quota } = await navigator.storage.estimate();
const ONE_TWENTY_MB = 120 * 1024 * 1024;
// Historically: Chromium capped Incognito quota well below
// the large, disk-proportional value normal windows report.
return quota < ONE_TWENTY_MB;
}
Ở chế độ duyệt web thông thường, trước đây Chromium tính hạn mức được báo cáo dựa trên một phần dung lượng đĩa trống thực tế — thường là hàng chục hoặc hàng trăm gigabyte. Ở Incognito, vì hồ sơ (profile) chỉ là tạm thời và thường bị giới hạn bởi RAM khả dụng thay vì đĩa, hạn mức trả về nhỏ hơn nhiều và tương đối đồng đều giữa các máy. Một script chỉ cần kiểm tra xem con số được báo cáo có thấp hơn một ngưỡng nhất định hay không (các bài viết công khai thường nêu ngưỡng khoảng 120 MB) để đưa ra kết luận với độ tin cậy cao.
Chính phương pháp suy đoán này — cùng các cơ chế dự phòng riêng cho Chromium và các kiểm tra riêng biệt cho Firefox, Safari, Edge và Opera — được duy trì dưới dạng một bản triển khai tham khảo mã nguồn mở tại Joe12387/detectIncognito trên GitHub, một nguồn tư liệu gốc hữu ích cho thấy các phép kiểm tra này đã trở nên đa dạng và đặc thù theo từng trình duyệt như thế nào theo thời gian.
Firefox và Safari cũng có dấu hiệu riêng
Khoảng trống về hạn mức lưu trữ của Chromium nhận được nhiều sự chú ý nhất vì thị phần của Chrome khiến nó trở thành mục tiêu giá trị cao nhất, nhưng Firefox và Safari cũng từng phát hành những đặc điểm riêng của chế độ riêng tư có thể bị phát hiện, vào những thời điểm khác nhau:
| Trình duyệt | Dấu hiệu lộ chế độ riêng tư trước đây | Nguyên nhân gốc |
|---|---|---|
| Chrome / Chromium | Tốc độ ghi FileSystem (trước 2019); hạn mức lưu trữ (sau 2019) | Hệ thống file trong bộ nhớ; hạn mức dựa trên RAM nhỏ hơn |
| Safari | localStorage.setItem() báo lỗi vượt hạn mức | Chế độ riêng tư giới hạn hạn mức Web Storage ở mức 0 byte |
| Firefox | indexedDB là null hoặc yêu cầu thất bại âm thầm | IndexedDB không khả dụng trong cửa sổ riêng tư suốt nhiều năm |
Có thể nói phiên bản của Safari là thô sơ nhất: trong nhiều năm, gọi localStorage.setItem() bên trong một cửa sổ riêng tư sẽ ném ra lỗi ngoại lệ ngay lập tức, vì Safari đặt hạn mức lưu trữ ở chế độ riêng tư về 0 thay vì cô lập nó. Chỉ cần bọc một try/catch quanh một lần ghi thử nghiệm là đủ để phát hiện chế độ này với độ chính xác gần như tuyệt đối. Apple đã sửa lỗi này trong Safari 11 bằng cách làm cho localStorage có thể ghi được đầy đủ trở lại trong cửa sổ riêng tư — dữ liệu chỉ đơn giản là nằm trong bộ nhớ và biến mất khi phiên kết thúc, thay vì bị chặn hoàn toàn.
IndexedDB của Firefox kể một câu chuyện tương tự nhưng theo chiều ngược lại: cửa sổ riêng tư hoặc không để lộ đối tượng indexedDB nào, hoặc khiến các yêu cầu mở thất bại — điều mà một script có thể bắt được dễ dàng như trường hợp ngoại lệ lưu trữ của Safari. Kể từ đó, Firefox đã chuyển sang hỗ trợ IndexedDB trong chế độ duyệt web riêng tư bằng cách dùng bộ lưu trữ được mã hóa, giới hạn theo phiên, khép lại khoảng trống cụ thể đó theo đúng cách Chrome đã khép lại khoảng trống FileSystem của mình — bằng cách làm cho việc triển khai chế độ riêng tư hoạt động đủ giống chế độ thông thường để tín hiệu về thời gian/tính khả dụng biến mất.
Một thập kỷ mèo vờn chuột
Kiểu mẫu diễn ra ở mọi trình duyệt đều là cùng một chu trình ba bước, chỉ khác nhau về mốc thời gian: một chi tiết triển khai làm lộ ra khác biệt của chế độ riêng tư → khác biệt đó bị biến thành vũ khí để phát hiện paywall hoặc gian lận → nhà cung cấp trình duyệt tái thiết kế cách triển khai chế độ riêng tư để loại bỏ khoảng trống, và điều đó thường mở ra một khoảng trống nhỏ hơn, tinh vi hơn ở một nơi khác. Các API lưu trữ vẫn tiếp tục là chiến trường vì toàn bộ nhiệm vụ của chế độ riêng tư là hoạt động khác đi với dữ liệu — thuộc tính duy nhất mà các script phát hiện luôn có thể cố gắng đo được.
Tình hình hiện tại vào năm 2026
Thủ thuật hạn mức StorageManager vẫn hoạt động trên bản Chrome ổn định hiện tại, nhưng những ngày tháng của nó có vẻ đã điểm. Chrome đã triển khai một biện pháp giảm thiểu có tên "hạn mức lưu trữ được báo cáo có thể dự đoán", báo cáo một hạn mức nhân tạo — usage cộng với giá trị nhỏ hơn giữa 10 GiB hoặc dung lượng đĩa đã làm tròn của bạn — ở mọi chế độ duyệt web đối với các trang không có quyền lưu trữ nâng cao, với mục đích rõ ràng là khiến cửa sổ thông thường và Incognito không thể phân biệt được bằng phép đo này. Tính đến giữa năm 2026, tính năng này đang được triển khai dần cho các trang có quyền lưu trữ hạn chế; các trang đã được cấp quyền lưu trữ không giới hạn hoặc đã chạm hạn mức bắt buộc thì hoàn toàn không bị ảnh hưởng, nên phương pháp suy đoán này chưa biến mất ở khắp mọi nơi cùng một lúc.
Bài học thực tiễn là không có một phép kiểm tra lưu trữ đơn lẻ nào là công cụ phát hiện Incognito bền vững, và không kỹ thuật nào trong số này từng cần đến cookie, canvas, hay một định danh lâu bền — đây là một cuộc chơi hẹp hơn, thay đổi nhanh hơn so với lấy dấu vân tay, được đấu từng API một chứ không phải từng tín hiệu một.
Chế độ ẩn danh có bảo vệ bạn khỏi việc bị lấy dấu vân tay không?
Tự thân nó thì không, và đây mới là điểm quan trọng hơn một khi câu hỏi về phát hiện đã được giải quyết theo hướng nào đi nữa. Một cửa sổ riêng tư thay đổi những gì được lưu trữ — lịch sử, cookie, dữ liệu biểu mẫu được lưu đệm — chứ không thay đổi những gì trình duyệt của bạn để lộ trên một trang đang hoạt động: cùng một hash canvas, chuỗi renderer WebGL, phông chữ và đặc điểm màn hình sẽ kết xuất giống hệt nhau dù cửa sổ có riêng tư hay không. Nếu bạn dùng Incognito với kỳ vọng được ẩn danh khỏi việc lấy dấu vân tay, bài viết Dấu vân tay trình duyệt: Cách bảo vệ quyền riêng tư sẽ giải thích vì sao kỳ vọng đó không đúng và điều gì thực sự làm giảm mức độ bị lộ.
Hãy chạy công cụ kiểm tra dấu vân tay của BrowserInsight một lần ở cửa sổ thông thường và một lần ở cửa sổ riêng tư — các tín hiệu nền tảng sẽ trông gần như giống hệt nhau, đây là cách rõ ràng nhất để thấy rằng "riêng tư" và "không thể lấy dấu vân tay" là hai điều đảm bảo hoàn toàn khác nhau.
Câu hỏi thường gặp
Website có luôn biết được tôi đang ở chế độ Incognito không?
Không. Việc phát hiện luôn phụ thuộc vào một đặc điểm triển khai cụ thể trong một phiên bản trình duyệt cụ thể, và những đặc điểm đó rồi sẽ được vá. Một kỹ thuật hoạt động đáng tin cậy vào năm ngoái có thể âm thầm ngừng hoạt động sau một bản cập nhật trình duyệt, và ngược lại — đây là một cuộc chạy đua vũ trang không ổn định, chứ không phải một năng lực đã được xác lập vững chắc.
Xóa cookie hoặc dùng VPN có ngăn được việc phát hiện Incognito không?
Không, bởi vì ngay từ đầu các kỹ thuật này không hề nhìn vào cookie hay địa chỉ IP của bạn. Chúng đo cách các API lưu trữ hoạt động trong phiên hiện tại, điều này không liên quan gì đến những gì VPN hay việc xóa cookie thay đổi.
Việc phát hiện chế độ Incognito có phạm pháp không?
Việc phát hiện tự nó không mặc nhiên phạm pháp, nhưng việc trang web dùng thông tin đó để làm gì có thể đặt ra những vấn đề pháp lý và đạo đức riêng — đặc biệt khi nó được dùng để lách qua lựa chọn quyền riêng tư có chủ đích của người dùng vì mục đích thương mại, chẳng hạn như ép reset paywall. Quy định pháp luật khác nhau tùy theo khu vực pháp lý và đây không phải là tư vấn pháp lý.
Vì sao Chrome mất nhiều năm mới khắc phục triệt để vấn đề này?
Vì mỗi bản vá chỉ khép lại một lỗ hổng cụ thể, còn ràng buộc cốt lõi — bộ nhớ lưu trữ của một phiên riêng tư buộc phải hoạt động khác với phiên thông thường ở đâu đó — vẫn liên tục mở ra những khoảng trống mới, hẹp hơn. Bản vá FileSystem năm 2019 không hề đụng đến khoảng trống hạn mức StorageManager, và biện pháp giảm thiểu hạn mức hiện tại bản thân nó vẫn đang được triển khai dần với các trường hợp ngoại lệ — một minh chứng rõ ràng cho việc đạt được "không thể phân biệt theo thiết kế" một cách hoàn toàn khó đến mức nào.
Kết luận
Phát hiện Incognito là một "người anh em họ" hẹp hơn và biến đổi nhanh hơn của lấy dấu vân tay trình duyệt: thay vì xây dựng một định danh lâu bền từ hàng chục tín hiệu, nó chỉ đặt ra một câu hỏi — liệu bộ nhớ lưu trữ có đang hoạt động như một phiên riêng tư hay không? — bằng bất kỳ API nào hiện đang trả lời được câu hỏi đó. Mỗi bản vá khép lại một khoảng trống thật sự, và mỗi khoảng trống mới rồi cũng sẽ bị tìm ra lần nữa — đây chính là lý do vì sao hiểu cơ chế lại quan trọng hơn việc tin tưởng bất kỳ tuyên bố cụ thể nào rằng "Incognito không thể bị phát hiện" theo đúng nghĩa đen.
Đọc thêm:


