Chuyển đến nội dung

Cơ chế phát hiện bot hoạt động ra sao — và vì sao Clearcote patch thẳng vào engine

Cách làm thông thường là patch navigator.webdriver, spoof WebGL vendor và ghi đè navigator.plugins bằng script. Các detector vẫn gắn cờ cách làm này — và lý do nằm ở cấu trúc, chứ không phải do còn sót thêm một thuộc tính nào đó chưa che.

Minh họa tính nhất quán: các tín hiệu độc lập xác nhận lẫn nhau sẽ ghép thành một danh tính duy nhất. Hai điểm không được nối — một giá trị bị spoof mà phía sau không có gì — chính là kẽ hở mà một phép đối chiếu chéo đọc ra.

Spoof bằng JavaScript tự để lộ mình

Spoof bằng JS là một hàm JavaScript nằm ở chỗ lẽ ra phải là hàm native. Detector gác giá trị trả về sang một bên và tra xét xem thứ trả về giá trị đó có phải là native hay không:

Dấu hiệu lộVì sao nó bắt được spoof JS
Tự lộ qua toStringMột method native khi chuyển thành chuỗi sẽ ra function get vendor() { [native code] }; còn hàm ghi đè sẽ ra chính mã nguồn của nó — chỉ một lệnh .toString() là bắt được.
Descriptor / hasOwnPropertygetOwnPropertyDescriptor làm lộ các prop đã bị định nghĩa lại, và hasOwnProperty('toString') trả về true trên một hàm đã bị can thiệp, trong khi hàm native trả về false.
TypeError khi sai thisGetter native ném ra một TypeError cụ thể khi được gọi với receiver sai; một shim viết sơ sài thì im lặng, và chính sự im lặng đó là tín hiệu.
Lấy lại hàm từ realm khácDetector lấy một Function.prototype.toString nguyên bản từ một iframe hoặc Web Worker mới rồi gọi nó lên getter của bạn — một realm khác với realm chứa bản patch main-world của bạn. Nó trả về mã nguồn của bạn. Bị bắt.

Clearcote không có lớp nào như vậy. Getter của navigator.userAgent chính là getter C++: nó báo [native code] vì nó đúng là native code, giống hệt nhau trên mọi realm — main frame, iframe và worker. Không có việc chiếm quyền (hijack) bằng JavaScript nào để mà phát hiện.

Ba lớp phát hiện bot

Các hệ thống chống bot hiện đại đọc ba bề mặt khác nhau về cấu trúc, ở ba nơi riêng biệt. Hiếm có công cụ nào xử lý được cả ba:

LớpCác dấu hiệu lộNơi cần sửaClearcote
A · driver / binarybiến ChromeDriver cdc_, bề mặt giao thức WebDriverĐiều khiển bằng CDP thô, bỏ chromedriver✅ một binary Chromium thuần — không có dấu vết driver
B · tác dụng phụ của CDPrò rỉ từ Runtime.enable, init-script được inject, thực thi trong main world, viewport mặc định của automationLớp điều khiển / CDP client✅ engine vô hiệu hóa rò rỉ từ Runtime.enable, SDK mặc định không inject script nào, và các thiết lập khởi chạy mặc định tránh viewport mặc định của automation (client của bạn chạy script riêng ở đâu là do client quyết định)
C · bề mặt fingerprintcanvas, WebGL, audio, font, navigator, TLS — trên main frame, iframe, workerEngine (C++), vì ghi đè bằng JS sẽ tự để lộ✅ đây chính là Clearcote

Điều quan trọng nhất: không có kẽ hở giữa giả và thật

Vì các cơ chế điều khiển nằm trong engine, JavaScript mà trang nhìn thấy và handshake mạng bên dưới đều đến từ cùng một Chromium thật. Không có kẽ hở JS giả chạy trên TLS thật nào để phép đối chiếu chéo bắt được — chính là kiểu thất bại đã làm lộ các công cụ dựa trên injection. Một seed --fingerprint tạo ra một cỗ máy duy nhất, nhất quán từ bên trong trên canvas, WebGL, audio, font và phần cứng. Handshake TLS và HTTP/2 bên dưới là của chính engine, và nó khớp vì persona báo đúng phiên bản thật của engine — hãy để trống brandVersion để giữ nguyên như vậy.

Và khi chính lớp nhiễu trở thành dấu hiệu lộ, hãy tắt nó đi — canvas và WebGL trả về giá trị tự nhiên trong khi phần spoof danh tính vẫn bật (dù thế nào thì audio đã render và client rects cũng không bao giờ bị làm nhiễu, và các scalar rate/latency của AudioContext vẫn tiếp tục đi theo persona; đây là lý do):

javascript
await launch({ fingerprint: "u1", fingerprintNoise: false });   // identity on, per-site farbling off

Khi tắt nhiễu, các danh tính trên cùng một máy sẽ có chung một hash canvas. canvasNoise: false chỉ tắt nhiễu canvas 2D và giữ lại nhiễu WebGL (bản build có giấy phép, 150 r12+).

Nhất quán giữa mạng và locale

Persona mới chỉ là một nửa: múi giờ, ngôn ngữ và địa chỉ WebRTC cũng phải khớp với nơi traffic xuất phát. Khi chạy sau proxy, hãy khởi chạy với geoip — SDK sẽ tra IP đầu ra (exit IP) của proxy rồi đặt múi giờ, danh sách ngôn ngữ, geolocation và địa chỉ WebRTC theo khu vực đó, và dừng việc khởi chạy nếu không xác định được khu vực. Nếu không dùng, múi giờ sẽ đi theo ngôn ngữ (en-US nghĩa là New York), bất kể proxy ở quốc gia nào. Xem Playwright & Puppeteer để biết các tùy chọn.

Đó là lý do Clearcote patch engine C++ thay vì inject JavaScript. Xem Các flag fingerprint để biết bạn điều khiển được những gì, và Kiến trúc để biết engine giữ mọi tín hiệu nhất quán với nhau ra sao.