# आपके JavaScript bundle में एक API key leak हो गई

एक credential deploy हुए bundle तक पहुँच गया। कैसे पता करें कि आपकी live site अभी क्या expose कर रही है, अगली build उस value के लिए क्या बदलती है, और rotation ही वह कदम क्यों है जो इसे बंद करता है।

Source: https://www.afterpack.dev/hi/docs/use-cases/accidental-secrets

एक credential, token या internal URL जिसे कभी आपके codebase से बाहर नहीं जाना था, आपके deploy किए गए bundle तक पहुँच गया। आपको जानना है कि अभी live क्या है, और उसके बारे में क्या करना है।

## Ship हुआ credential लोग नहीं, scanners ढूँढते हैं

Leak हुआ credential उसी पल से एक live incident है जब वह serve होता है। उसे ढूँढने का रास्ता automated है: कोई secret scanner, bundle scraper या किसी researcher का script JavaScript फ़ाइल में plaintext key को बहुत पहले ढूँढ लेता है, इससे पहले कि कोई इंसान बैठकर आपका code पढ़े। Exposure की घड़ी deploy के समय से चल रही है, आपके dashboards चाहे जो दिखाएँ।

नुकसान इस पर निर्भर करता है कि credential का scope क्या है। किसी shared account पर व्यापक permissions वाली key, सीमित scope वाली key से बड़ा incident है। दोनों उसी पल से incidents हैं जब उन तक network पर पहुँचा जा सकता है।

## पता करें कि आपकी live site क्या expose करती है

कुछ भी बदलने से पहले deploy की गई site पर [`audit`](https://www.afterpack.dev/hi/docs/audit) चलाएँ:

```bash
npx afterpack@latest audit https://yoursite.com
```

यह exposed secrets, पहुँच योग्य source maps और ship किया गया JavaScript कितना protected है, यह उस bundle के लिए बताता है जो visitor के browser को अभी मिलता है। पहले secrets और source maps पढ़ें। बिना findings वाली report का मतलब है कि इस scan को उन URLs पर कुछ नहीं मिला, और यह इस बात का सबूत नहीं है कि कुछ भी leak नहीं हुआ।

## अगली build उस value के लिए क्या बदलती है

[Default preset](https://www.afterpack.dev/hi/docs/presets) build के समय आपके string literals को encode करता है, इसलिए internal endpoint, flag का नाम और credential आपकी serve की गई फ़ाइल में plaintext नहीं रहते। नए artifact में key के लिए, या उसके आसपास के text के लिए, `grep` करने पर वह नहीं मिलती, और ज़्यादातर leak हुई keys ढूँढने वाले automated scrapers ख़ाली हाथ लौटते हैं। कुछ literals हर preset पर पढ़ने योग्य रहते हैं, और [Protection Map](https://www.afterpack.dev/hi/docs/protection-map) बताता है कि कौन-से।

इससे आपको rotation ठीक से पूरा करने का समय मिलता है। यह leak को undo नहीं करता। पुरानी build पहले ही बाहर जा चुकी है, और value नई build में भी मौजूद है। Encoding यह बदलती है कि पढ़ने वाले को फ़ाइल में क्या मिलता है, जबकि code अब भी value रखता है और उसका उपयोग करता है।

## Source maps और backups को pipeline से बाहर रखें

जाँचें कि आपकी pipeline में कुछ भी ऐसे outputs चालू नहीं करता जो आपका मूल source वापस सौंप दें:

```json
{
  "sourceMap": { "enabled": false, "emitUrl": false, "sourcesContent": false },
  "build": { "backup": false },
  "protectionMap": { "enabled": true }
}
```

Source map obfuscated फ़ाइल को वापस आपके पढ़ने योग्य source से जोड़ता है, और [`sourceMap.sourcesContent`](https://www.afterpack.dev/hi/docs/config#sourceMap-sourcesContent) उस source को map के अंदर embed कर देता है। Production में maps डिफ़ॉल्ट रूप से बंद रहते हैं, और debugging के लिए उन्हें चालू करने वाली pipeline ही आमतौर पर वह रास्ता है जिससे कोई map server तक पहुँचता है; जब आपको production traces चाहिए, तो [map के साथ build करें और उसे private रखें](https://www.afterpack.dev/hi/docs/best-practices#debug-production-traces-without-publishing-the-map)।

[`build.backup`](https://www.afterpack.dev/hi/docs/config#build-backup) copy ज्यों का त्यों आपका source है। CLI इसे project root पर gitignored `.afterpack/backups/` में रखता है, जो भी आप deploy करते हैं उससे बाहर। जब कोई framework plugin copy को output के बगल में लिखता है और आपका deploy उस directory को पूरा का पूरा ship करता है, तो इसे `false` पर सेट करें। [`protectionMap.enabled`](https://www.afterpack.dev/hi/docs/config#protectionMap-enabled) Protection Map को build machine पर `.afterpack/` में लिखता है, और CLI उसे किसी serve होने वाले path में लिखने से इनकार करता है।

## पुष्टि करें कि finding चली गई

Rotate और redeploy करने के बाद audit फिर से चलाएँ, और पुष्टि करें कि पहले वाली finding चली गई है। Result को script में पढ़ने के लिए [`--diagnostics.format=json`](https://www.afterpack.dev/hi/docs/config#diagnostics-format) जोड़ें। अगर build [`DIAG_SURVIVING_READABLE_LITERAL`](https://www.afterpack.dev/hi/docs/diagnostics) report करती है, तो output में अब भी कोई पढ़ने योग्य literal है, और [`strings.leaks.max`](https://www.afterpack.dev/hi/docs/config#strings-leaks-max) आपकी सेट की गई संख्या से अधिक बचे रहने पर build को fail कर देता है। वह diagnostic literals को सामान्य रूप से गिनता है और यह नहीं बताता कि उनमें से कौन-सा credential है।

## Obfuscation क्या undo नहीं कर सकता

Encoding यहाँ से आगे हर build पर लागू होती है, इसलिए plaintext value उस artifact से हट जाती है जिसे scanner पढ़ता है, और audit बताता है कि live site आज क्या expose करती है। यह उस build तक नहीं पहुँच सकता जो पहले ही बाहर जा चुकी है: credential को rotate करना वह कदम है जो incident को बंद करता है, और redeploy करना ही पुराने पढ़ने योग्य bundle को serve होने से रोकता है।

## आगे

- [किसी live site के JavaScript का audit करें](https://www.afterpack.dev/hi/docs/audit): जाँचों की पूरी सूची और report कैसे पढ़ें।
- [Best practices](https://www.afterpack.dev/hi/docs/best-practices#if-you-shipped-a-secret-by-accident): rotation के कदम क्रम से।
- [Build & CI](https://www.afterpack.dev/hi/docs/builds): source maps और backups को हर environment से बाहर रखना।
