Cloudflare ਦਾ bot-challenge ਸਿਸਟਮ ਆਮ HTML ਫਾਰਮ ਸਬਮਿਸ਼ਨਾਂ ਨੂੰ ਚੁੱਪਚਾਪ ਖਤਮ ਕਰ ਸਕਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਇੱਕ ਸਧਾਰਨ ਭੁਗਤਾਨ (payment) ਕਲਿੱਕ ਅਸਲੀ ਉਪਭੋਗਤਾਵਾਂ ਲਈ ਇੱਕ ਅੰਤ ਬਣ ਜਾਂਦਾ ਹੈ। ਰਿਕੁਐਸਟ ਨੂੰ native navigation POST ਤੋਂ fetch-first flow ਵਿੱਚ ਬਦਲਣ ਨਾਲ ਸੁਰੱਖਿਆ ਨਾਲ ਸਮਝੌਤਾ ਕੀਤੇ ਬਿਨਾਂ ਅਨੁਭਵ ਨੂੰ ਬਹਾਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।
ਇਹ ਸਮੱਸਿਆ ਕਿਉਂ ਮਹੱਤਵਪੂਰਨ ਹੈ
ਇੱਕ ਡਿਵੈਲਪਰ ਨੇ ਇੱਕ ਭੁਗਤਾਨ ਫਾਰਮ ਰਿਲੀਜ਼ ਕੀਤਾ ਜੋ ਹਰ ਟੈਸਟ ਸੂਟ, curl, ਅਤੇ ਲੋਕਲ ਸਰਵਰ 'ਤੇ ਕੰਮ ਕਰ ਰਿਹਾ ਸੀ। ਉਹੀ ਫਾਰਮ, ਜਦੋਂ ਕਿਸੇ ਗਾਹਕ ਨੇ Chrome ਦੀ ਵਰਤੋਂ ਕੀਤੀ, ਤਾਂ ਪਹਿਲੇ ਕਲਿੱਕ ਤੋਂ ਬਾਅਦ ਇੱਕ ਸੁਰੱਖਿਆ ਐਰਰ (security error) ਅਤੇ ਦੂਜੇ 'ਤੇ “timeout-or-duplicate” ਸੁਨੇਹਾ ਦਿਖਾਇਆ। ਇਸ ਅਸਫਲਤਾ ਕਾਰਨ ਤਿੰਨ hot-fix ਰਿਲੀਜ਼ ਅਤੇ ਡੀਬੱਗਿੰਗ (debugging) ਲਈ ਪੂਰਾ ਇੱਕ ਦਿਨ ਖਰਾਬ ਹੋ ਗਿਆ।
ਲੁਕਿਆ ਹੋਇਆ ਐਜ (edge)
ਇਹ ਫਾਰਮ ਇੱਕ open-source Astro ਪੈਕੇਜ ਵਿੱਚ ਹੈ ਜੋ ਇੱਕ ਸਾਧਾਰਨ HTML <form> ਐਲੀਮੈਂਟ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਉਪਭੋਗਤਾ Pay 'ਤੇ ਕਲਿੱਕ ਕਰਦਾ ਹੈ, ਤਾਂ ਸਰਵਰ Stripe ਨੂੰ 303 redirect ਨਾਲ ਜਵਾਬ ਦਿੰਦਾ ਹੈ, ਅਤੇ ਬ੍ਰਾਊਜ਼ਰ ਬਿਨਾਂ ਕਿਸੇ JavaScript ਦੇ ਰੀਡਾਇਰੈਕਟ ਦੀ ਪਾਲਣਾ ਕਰਦਾ ਹੈ। ਸਾਈਟਾਂ ਇਸ ਪੈਟਰਨ ਦੀ ਵਰਤੋਂ ਉਦੋਂ ਬਦਲਵੇਂ ਵਿਕਲਪ (fallback) ਵਜੋਂ ਕਰਦੀਆਂ ਹਨ ਜਦੋਂ ਸਕ੍ਰਿਪਟਾਂ ਡਿਸੇਬਲ ਹੁੰਦੀਆਂ ਹਨ।
Cloudflare ਸਾਈਟ ਦੇ ਸਾਹਮਣੇ ਬੈਠਦਾ ਹੈ ਅਤੇ ਇੱਕ bot-detection engine ਚਲਾਉਂਦਾ ਹੈ। ਆਮ GET ਰਿਕੁਐਸਟਾਂ ਲਈ, ਇਹ ਇੱਕ ਅੰਤਰਾਲੀ (interstitial) ਚੈਲੇਂਜ (ਜਿਵੇਂ ਕਿ CAPTCHA ਜਾਂ JavaScript ਚੈੱਕ) ਦਿਖਾ ਸਕਦਾ ਹੈ। ਬ੍ਰਾਊਜ਼ਰ ਦੁਆਰਾ ਚੈਲੇਂਜ ਪਾਸ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਰਿਕੁਐਸਟ ਅੱਗੇ ਵਧਦੀ ਹੈ।
ਹਾਲਾਂਕਿ, ਇੱਕ navigation POST ਨੂੰ ਚੈਲੇਂਜ ਲਈ ਰੋਕਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਅਤੇ ਫਿਰ ਉਸਦੀ body ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਦੇ ਹੋਏ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਐਜ (edge) ਰਿਕੁਐਸਟ ਨੂੰ ਰੱਦ ਕਰ ਦਿੰਦਾ ਹੈ ਅਤੇ 503 ਸਟੇਟਸ ਵਾਪਸ ਕਰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਬ੍ਰਾਊਜ਼ਰ ਦੇ ਸਾਹਮਣੇ ਇੱਕ ਖਾਲੀ ਪੇਜ ਜਾਂ ਇੱਕ ਆਮ ਐਰਰ ਰਹਿ ਜਾਂਦਾ ਹੈ। ਆਟੋਮੇਟਿਡ ਟੈਸਟ ਬ੍ਰਾਊਜ਼ਰ, ਜੋ ਉਸੇ ਫਿੰਗਰਪ੍ਰਿੰਟ (fingerprint) ਨੂੰ ਰੱਖਦੇ ਹਨ ਜਿਸ 'ਤੇ Cloudflare ਭਰੋਸਾ ਕਰਦਾ ਹੈ, ਕਦੇ ਵੀ ਚੈਲੇਂਜ ਨੂੰ ਟ੍ਰਿਗਰ ਨਹੀਂ ਕਰਦੇ, ਇਸ ਲਈ ਸਮੱਸਿਆ ਉਦੋਂ ਤੱਕ ਅਦਿੱਖ ਰਹਿੰਦੀ ਹੈ ਜਦੋਂ ਤੱਕ ਕੋਈ ਅਸਲੀ ਉਪਭੋਗਤਾ ਸਾਈਟ 'ਤੇ ਨਹੀਂ ਆਉਂਦਾ।
ਲੌਗਸ (logs) ਨੇ ਕੀ ਸਾਹਮਣੇ ਲਿਆਂਦਾ
ਇੱਕ ਉਪਭੋਗਤਾ ਦੇ Chrome ਸੈਸ਼ਨ ਤੋਂ ਲਾਈਵ ਨੈੱਟਵਰਕ ਟ੍ਰੇਸ ਨੇ ਇੱਕੋ ਐਂਡਪੁਆਇੰਟ (endpoint) 'ਤੇ ਦੋ ਵਿਰੋਧੀ ਰਿਕੁਐਸਟਾਂ ਦਿਖਾਈਆਂ:
- Navigation POST → 503 ਰਿਸਪਾਂਸ, ਟੈਬ ਹੈਂਗ ਹੋ ਗਿਆ।
- fetch() POST → ਰਿਕੁਐਸਟ ਪੂਰੀ ਹੋ ਗਈ।
ਦੋਵੇਂ ਰਿਕੁਐਸਟਾਂ ਇੱਕੋ ਅਸਲ (origin) ਤੋਂ ਆਈਆਂ ਸਨ, ਇੱਕੋ ਕ੍ਰੈਡੈਂਸ਼ੀਅਲਜ਼ (credentials) ਲੈ ਕੇ ਆਈਆਂ ਸਨ, ਅਤੇ ਇੱਕੋ ਸਮੇਂ 'ਤੇ ਹੋਈਆਂ ਸਨ। ਇਕਲੌਤਾ ਅੰਤਰ ਟ੍ਰਾਂਸਪੋਰਟ ਵਿਧੀ (transport method) ਦਾ ਸੀ। fetch ਰਿਕੁਐਸਟ ਨੇ ਉਸ ਅੰਤਰਾਲੀ ਫਲੋਅ (interstitial flow) ਨੂੰ ਬਾਈਪਾਸ ਕਰ ਦਿੱਤਾ ਜੋ navigation POSTs ਨੂੰ ਰੋਕਦਾ ਹੈ।
ਉਹ ਰਸਤੇ ਜੋ ਕਿਤੇ ਨਹੀਂ ਪਹੁੰਚੇ
ਡਿਵੈਲਪਰ ਨੇ ਕਈ ਸੁਧਾਰ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜੋ ਅਸਲ ਕਾਰਨ ਨੂੰ ਮਿਸ ਕਰ ਗਏ:
- Turnstile ਟੋਕਨਾਂ ਨੂੰ ਰੀਨਿਊ ਕੀਤਾ, ਇਹ ਮੰਨ ਕੇ ਕਿ ਉਹ ਐਕਸਪਾਇਰ ਹੋ ਗਏ ਸਨ।
- IP ਰੇਂਜਾਂ ਨੂੰ ਵ੍ਹਾਈਟਲਿਸਟ ਕੀਤਾ, ਇਹ ਸੋਚ ਕੇ ਕਿ ਬਲਾਕ ਲੋਕੇਸ਼ਨ-ਅਧਾਰਤ ਸੀ।
- ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਡਿਸੇਬਲ ਕੀਤਾ, ਸਰਵਿਸ ਵਰਕਰਾਂ ਨੂੰ ਸਾਫ਼ ਕੀਤਾ, ਅਤੇ ਕੁਕੀਜ਼ ਨੂੰ ਡਿਲੀਟ ਕੀਤਾ।
ਹਰੇਕ ਤਬਦੀਲੀ ਨਾਲ ਐਰਰ ਬਦਲਿਆ ਨਹੀਂ, ਕਿਉਂਕਿ ਅਸਫਲਤਾ ਕਲਾਇੰਟ ਜਾਂ ਸਰਵਰ ਕੋਡ ਵਿੱਚ ਨਹੀਂ, ਸਗੋਂ ਅੱਪਸਟ੍ਰੀਮ (upstream) ਐਜ (edge) 'ਤੇ ਹੋਈ ਸੀ।
ਵਿਵਹਾਰਕ ਹੱਲ (The pragmatic fix)
Cloudflare ਦੀ ਸੁਰੱਖਿਆ ਨੂੰ ਬੰਦ ਕਰਨ ਦੀ ਬਜਾਏ, ਫਾਰਮ ਨੂੰ fetch-first ਪੈਟਰਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਮੁੜ-ਇੰਜੀਨੀਅਰ (re-engineered) ਕੀਤਾ ਗਿਆ ਸੀ:
- ਫਾਰਮ ਦਾ ਡੇਟਾ ਇਕੱਠਾ ਕਰੋ ਅਤੇ ਇਸਨੂੰ
fetch()ਦੇ ਨਾਲ ਇੱਕ JSON ਪੇਲੋਡ (payload) ਵਜੋਂ ਭੇਜੋ। - ਸਰਵਰ ਦੇ ਰਿਸਪਾਂਸ ਨੂੰ ਸੰਭਾਲੋ। ਜੇਕਰ ਸਰਵਰ ਭੁਗਤਾਨ ਗੇਟਵੇ ਲਈ ਇੱਕ URL ਵਾਪਸ ਕਰਦਾ ਹੈ, ਤਾਂ ਉੱਥੇ ਜਾਣ ਲਈ ਇੱਕ ਸਧਾਰਨ GET ਰਿਕੁਐਸਟ ਨਾਲ
location.assign()ਨੂੰ ਕਾਲ ਕਰੋ।
Fetch ਰਿਕੁਐਸਟਾਂ ਅੰਤਰਾਲੀ ਚੈਲੇਂਜ ਨੂੰ ਟ੍ਰਿਗਰ ਨਹੀਂ ਕਰਦੀਆਂ, ਇਸ ਲਈ POST ਅਸਲ ਸਰਵਰ ਤੱਕ ਪਹੁੰਚ ਜਾਂਦੀ ਹੈ। ਅਗਲਾ GET ਰੀਡਾਇਰੈਕਟ ਸੁਰੱਖਿਅਤ ਰੂਪ ਵਿੱਚ ਕਿਸੇ ਵੀ ਚੈਲੇਂਜ ਤੋਂ ਲੰਘ ਸਕਦਾ ਹੈ, ਕਿਉਂਕਿ GET ਬੌਡੀਜ਼ ਖਾਲੀ ਹੁੰਦੀਆਂ ਹਨ ਅਤੇ ਉਪਭੋਗਤਾ ਦੁਆਰਾ ਚੈਲੇਂਜ ਪਾਸ ਕਰਨ ਤੋਂ ਬਾਅਦ ਉਹਨਾਂ ਨੂੰ ਦੁਬਾਰਾ ਚਲਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।
ਡਿਵੈਲਪਰਾਂ ਲਈ ਜੋਖਮ
- ਉਪਭੋਗਤਾ ਦਾ ਭਰੋਸਾ: ਇੱਕ ਭੁਗਤਾਨ ਫਾਰਮ ਜੋ ਚੁੱਪਚਾਪ ਅਸਫਲ ਹੋ ਜਾਂਦਾ ਹੈ, ਵਿਸ਼ਵਾਸ ਨੂੰ ਘਟਾਉਂਦਾ ਹੈ ਅਤੇ ਰੈਵੇਨਿਊ ਦੇ ਨੁਕਸਾਨ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦਾ ਹੈ।
- ਮੇਨਟੇਨੈਂਸ ਦਾ ਬੋਝ: ਇਸ ਘਟਨਾ ਲਈ ਤਿੰਨ ਪੈਚ ਰਿਲੀਜ਼ ਅਤੇ ਪੂਰੇ ਇੱਕ ਦਿਨ ਦੀ ਜਾਂਚ ਦੀ ਲੋੜ ਪਈ।
- ਟੈਸਟਿੰਗ ਦੇ ਅੰਧ-ਬਿੰਦੂ (blind spots):
ਮੁੱਖ ਨੁਕਤਾ: ਜਦੋਂ Cloudflare ਦੇ ਬੋਟ ਚੁਣੌਤੀਆਂ (bot challenges) ਸਰਗਰਮ ਹੁੰਦੀਆਂ ਹਨ, ਤਾਂ ਇੱਕ ਸਾਧਾਰਨ HTML ਫਾਰਮ ਸਬਮਿਸ਼ਨ ਚੁੱਪਚਾਪ ਫੇਲ ਹੋਣ (silent failure) ਦੇ ਜੋਖਮ ਵਿੱਚ ਹੁੰਦਾ ਹੈ। fetch() ਰਾਹੀਂ POST ਨੂੰ ਰੀ-ਰੂਟ ਕਰਨਾ ਅਤੇ GET ਰੀਡਾਇਰੈਕਟ ਨਾਲ ਫਲੋਅ ਨੂੰ ਪੂਰਾ ਕਰਨਾ ਸੁਰੱਖਿਆ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਦੇ ਹੋਏ ਐਜ (edge) ਦੀ ਸੀਮਾ ਨੂੰ ਟਾਲ ਦਿੰਦਾ ਹੈ। ਐਜ (edge) ਨੂੰ ਸਿਰਫ਼ ਇੱਕ ਨੈੱਟਵਰਕ ਹੌਪ ਵਜੋਂ ਨਹੀਂ, ਸਗੋਂ ਕੋਡ ਵਜੋਂ ਸਮਝੋ, ਅਤੇ ਉਸੇ ਅਨੁਸਾਰ ਆਪਣੇ ਟ੍ਰਾਂਸਪੋਰਟਸ ਨੂੰ ਡਿਜ਼ਾਈਨ ਕਰੋ।
