npx afterpack@latest audit <url> किसी site द्वारा ship किया गया JavaScript fetch करता है और बताता है कि उसे पढ़ने वाला उसमें से क्या निकाल सकता है। यह वही scanner है जो public security scanner को चलाता है: सार्वजनिक source maps, आपका अपना code कितना पढ़ने योग्य है, leak हुए credentials, और बिना score के vendor code, dynamic-code sinks और पहचाना गया stack।
Audit केवल पढ़ता है। यह कुछ भी नहीं बदलता, इसे किसी account की ज़रूरत नहीं, और यह केवल वही छूता है जो URL सार्वजनिक रूप से serve करता है।
audit obfuscation engine नहीं चलाता। यह किसी site के ship किए गए assets fetch करता है और उसका विश्लेषण करता है जो पहले से exposed है। कोई भी build flag इस पर लागू नहीं होता।
इसे चलाएँ
$ npx afterpack@latest audit https://yoursite.comScheme वैकल्पिक है: केवल hostname देने पर उसे https:// में normalize कर दिया जाता है। Scanner पेज fetch करता है, उसे render करता है ताकि client-side पर load होने वाले bundles भी शामिल हों, फिर उसे मिले हर JavaScript resource का विश्लेषण करता है।
कोई local-directory mode नहीं है। npx afterpack@latest audit ./dist समर्थित नहीं है। Argument एक URL होना चाहिए। इसके बजाय किसी preview deployment का audit करें।
यह क्या जाँचता है
| जाँच | यह क्या ढूँढती है |
|---|---|
| सार्वजनिक source maps | आपकी सबसे बड़ी scripts के बगल में .map फ़ाइल, जो header, comment या सीधे request से मिलती है, और क्या उसमें आपका मूल source शामिल है। Source वाला map score को 10 पर सीमित करता है, केवल mappings वाला 50 पर। सार्वजनिक .git directory source वाले map के बराबर गिनी जाती है। |
| पढ़ने योग्य code | आपकी हर अपनी script के लिए, पढ़ने वाला सामान्य code के रूप में कितना वापस पाता है: अंग्रेज़ी strings, अर्थपूर्ण नाम और property access, tokens पर मापा गया। हर फ़ाइल को सादा, minified या obfuscated ग्रेड मिलता है। 75 अंक, bytes के अनुसार भारित। इसी सवाल का per-token रूप Protection Map है। |
| Leak हुए credentials | Private keys, cloud secrets, payment secrets, repository और chat tokens, database URLs और bearer tokens, छिपाकर और संदर्भ के साथ दिखाए जाते हैं। 25 अंक। Emails, IP पते और publishable browser keys सूचीबद्ध होते हैं, score नहीं होते। |
| Vendor code | Site से भेजे गए third-party SDKs, host, path या license banner से पहचाने गए। अलग सूचीबद्ध, score से बाहर। |
| Hygiene | eval(), Function constructor, document.write और raw HTML sinks, third-party domains और पहचाना गया stack। सूचीबद्ध, score नहीं होते। |
Exposed source maps
Source map आपके ship किए गए bundle को वापस आपके मूल, पढ़ने योग्य source से जोड़ता है। इसे कभी production में ship न करें: attacker उसे download करता है और आपका code वैसे ही पढ़ लेता है जैसे आपने लिखा था।
Audit इसे पकड़ लेता है। AfterPack ख़ुद production build में डिफ़ॉल्ट रूप से कोई .map sibling नहीं लिखता (देखें sourceMap.enabled और sourceMap.emitUrl), लेकिन यह आपके bundler को पहले ही एक emit करने से नहीं रोक सकता।
परिणाम पढ़ना
CLI हर phase के पूरा होते ही उसे छापता है, critical और high findings को आते ही inline दिखाता है, फिर एक summary box के साथ ख़त्म करता है: 100 में से score, scripts की गिनती, severity के अनुसार findings और पहचाना गया stack। अंत में यह हर critical finding की सूची और web पर पूरी report का link देता है।
इसे ऊपर से नीचे पढ़ें:
- पहले source maps। सार्वजनिक map पढ़ने वाले को आपका source वैसा ही दे देता है जैसा आपने लिखा, build चाहे जो करे। Production से हर
.mapहटाएँ। - फिर credentials। Leak हुए हर credential को rotate करें, फिर उसे ship करना बंद करें।
- आख़िर में पढ़ने योग्य code। अगर आपकी अपनी फ़ाइलें सादा या minified ग्रेड पाती हैं, तो उनमें कोई सार्थक protection नहीं है। एक build AfterPack से गुज़ारें (Quickstart में लगभग पाँच मिनट लगते हैं)।
Output डिफ़ॉल्ट रूप से इंसानों के पढ़ने योग्य text है। --diagnostics.format=json इसके बजाय stdout पर एक JSON document देता है — findings, score और report link — और इंसानों के पढ़ने योग्य हर पंक्ति stderr पर चली जाती है; --diagnostics.level=none इसके ऊपर progress phases को भी चुप कर देता है। Share करने योग्य report हमेशा वह web link है जिस पर run ख़त्म होता है।
ग्रेड नहीं दिया गया
जब page में site का अपना कोई code नहीं होता, या scanner उसे नहीं पढ़ पाता, तो scan को कोई score नहीं मिलता। Report में किसी संख्या की जगह ग्रेड नहीं दिया गया लिखा होता है, और वजह बताई जाती है:
- अपना कोई JavaScript नहीं। Page site से अपनी कोई script लोड नहीं करता, इसलिए ग्रेड करने को कुछ नहीं है। ऐसा page scan करें जो app लोड करता है, जैसे product page।
- स्कैनर रोका गया। Site ने page की जगह bot check या error page से scanner को जवाब दिया।
- Scripts पढ़ी नहीं गईं। Page अपनी scripts लोड करता है, पर scanner उनमें से ज़्यादातर नहीं पढ़ पाया। फिर से scan करें।
रोका गया scan, या जिसकी scripts पढ़ी नहीं गईं, उसे 30 मिनट की repeat window में कभी दोबारा इस्तेमाल नहीं किया जाता, इसलिए नया scan तुरंत चलता है। जब सिर्फ़ कुछ scripts नहीं पढ़ी जा सकीं, तो scan पढ़ी गई scripts पर ग्रेड होता है और report बताती है कि कितनी छूट गईं।
Exit codes
| Code | कब |
|---|---|
0 | Scan पूरा हुआ। तब भी जब उसे critical issues मिले हों। |
1 | Scan विफल हुआ: पहुँच से बाहर URL, server-side error, daily rate limit, या कोई stream जो पूरा हुए बिना ख़त्म हो गई। |
64 | ग़लत उपयोग: कोई URL नहीं दिया, एक से अधिक URL, या URL ग़लत बना है। |
ये audit के अपने codes हैं। Obfuscation run जिन build exit codes का उपयोग करता है, वे अलग हैं।
चूँकि पूरा हुआ scan जो भी मिले, 0 के साथ exit करता है, इसलिए npx afterpack@latest audit … && deploy findings पर fail नहीं होता। कोई severity threshold flag नहीं है: अगर आप findings पर gate करना चाहते हैं, तो --diagnostics.format=json से findings ख़ुद पढ़ें। Audit को release से पहले की एक review step की तरह इस्तेमाल करें जिसे आप हाथ से पढ़ते हैं। Obfuscation run ही वह हिस्सा है जो build को fail करता है।
बिना authentication के scans की सीमा हर IP पर 24 घंटों में 3 है, और एक site को प्रति घंटे 10 बार scan किया जा सकता है। सीमा तक पहुँचने पर यह छापता है कि कितनी देर रुकना है और 1 के साथ exit करता है। 30 मिनट के भीतर उसी URL का दोबारा scan मौजूदा report लौटाता है और सीमा में नहीं गिना जाता।
AfterPack बैज
बैज को अपनी site के footer या README में लगाएँ। जब तक आपके host का नवीनतम scan site के अपने code पर AfterPack output, कोई सार्वजनिक source map या credentials नहीं, और grade A पाता है, यह Protected by AfterPack दिखाता है। अन्यथा यह नवीनतम score दिखाता है, या not graded जब तक आपके host के किसी scan ने site को ग्रेड नहीं किया। जिस host को कभी scan नहीं किया गया, वह Scan with AfterPack दिखाता है। बैज नवीनतम report से link करता है और नए scan के एक घंटे के भीतर update होता है।
Footer:
<a href="https://www.afterpack.dev/security-scanner/site/yoursite.com?ref=badge" rel="noopener" title="AfterPack security scan">
<img src="https://www.afterpack.dev/badge/yoursite.com.svg?style=compact&theme=dark" alt="AfterPack badge" width="200" height="32" loading="lazy">
</a>README:
[](https://www.afterpack.dev/security-scanner/site/yoursite.com?ref=badge)Styles: footers के लिए compact (200×32) और wide (236×48), READMEs के लिए flat (20 px)। Themes: dark और light। security scanner के हर result page पर उसके host के लिए ये snippets हैं।
आगे
- Builds & CI: obfuscation को अपनी release pipeline में शामिल करना, और reproducible output के लिए seed pin करना।
- Best practices: क्या mark करें, क्या अछूता छोड़ें, और source-map का नियम।
- Security scanner: वही जाँचें आपके browser में, बिना install के, पूरी share करने योग्य report के साथ।
- Protection Map: obfuscate करना शुरू करने के बाद आपकी अपनी build का per-token view।
- AfterPack किसकी जगह नहीं लेता: leak हुए secret को rotation चाहिए; बाद में उसे obfuscate करने से कोई मदद नहीं मिलती।