Catalog108 / challenges / antibot/tls-fingerprint

TLS / JA3 fingerprint (conceptual)

intermediate Matching curriculum →

What this challenge teaches

Teaches: Real anti-bots fingerprint the TLS ClientHello (JA3 hash). Python requests has a stable JA3 hash; Chrome has different.

Expected output: Use curl-cffi or tls-client; they replicate Chrome's TLS handshake. PHP cannot demonstrate this server-side, so this is conceptual.

Submit your scraper's JSON output to /challenges/antibot/tls-fingerprint/grade (grader endpoint is part of a later phase; URL is reserved now).

TLS fingerprinting can't be demonstrated server-side from PHP, the inspection happens at the load-balancer / CDN layer. This challenge is conceptual.

What it looks like in practice

Python requests with default ciphers has a stable JA3 hash. Chrome's JA3 is different. Servers running tools like salesforce/ja3 compare the incoming hash against an allow-list.

How to defeat it

# Python: curl-cffi mirrors Chrome's TLS handshake
from curl_cffi import requests
r = requests.get(url, impersonate="chrome120")