
पाइथन रिपॉजिटरी में हार्डकोडेड रहस्यों का पता लगाता है और स्वतः ठीक करता है — जब सुधार आपके कोड को तोड़ सकता है तो मना कर देता है।
Autonoma हार्डकोडेड रहस्यों का पता लगाता है और AST पुनर्लेखन का उपयोग करके उन्हें os.environ[...] संदर्भों से बदल देता है। परिवर्तन केवल तभी लागू किए जाते हैं जब पुनर्लेखन निर्धारणीय और अर्थ-संरक्षण करने वाला हो।
पुनर्लेखन पार्स किए गए सिंटैक्स ट्री का उपयोग करते हैं — रॉ टेक्स्ट पर regex नहीं। स्थानीय रूप से कोई नेटवर्क कॉल के बिना चलता है। CI में आइडेम्पोटेंट, न्यूनतम अंतर के साथ काम करता है।

कोडबेस में हार्डकोडेड रहस्य:
अधिकांश उपकरण उनका पता लगाते हैं। Autonoma केवल उन चीजों को छूता है जिन्हें वह बदलना सुरक्षित साबित कर सकता है।
autonoma scan .
autonoma fix .
git diff
pip install autonoma-cli
इसे अपने .pre-commit-config.yaml में जोड़ें ताकि रहस्य आपके इतिहास में प्रवेश न कर सकें:
- repo: local
hooks:
- id: autonoma
name: Autonoma Scan
entry: autonoma scan
language: system
types: [python]
# 1. हार्डकोडेड रहस्यों वाली एक परीक्षण फ़ाइल बनाएं
cat > test_secrets.py << 'EOF'
SENDGRID_API_KEY = "sg-live-abc123xyz789"
DB_PASSWORD = "Pr0dAccess2024!"
EOF
# सुरक्षित उपचार के लिए आवश्यक एनवी अनुबंध फ़ाइल भी बनाएं
printf 'SENDGRID_API_KEY=\nDB_PASSWORD=\n' > .env.example
# 2. स्कैन — JSON निष्कर्ष stdout पर भेजता है
autonoma scan test_secrets.py
# 3. फिक्स — फ़ाइल को वहीं फिर से लिखता है
autonoma fix test_secrets.py
# 4. फिर से स्कैन करें — अब साफ होना चाहिए (एक्ज़िट 0)
autonoma scan test_secrets.py
# 5. परिणाम देखें
cat test_secrets.py
फिक्स के बाद अपेक्षित आउटपुट:
import os
SENDGRID_API_KEY = os.environ["SENDGRID_API_KEY"]
DB_PASSWORD = os.environ["DB_PASSWORD"]
डिटेक्शन मोड। JSON को stdout पर और मानव-पठनीय सारांश को stderr पर आउटपुट करता है। गैर-परिवर्तनकारी — कभी भी फ़ाइलों को संशोधित नहीं करता।
# किसी निर्देशिका को स्कैन करें (JSON निष्कर्ष stdout पर)
autonoma scan src/
# JSON परिणाम को एक फ़ाइल में सहेजें
autonoma scan src/ > findings.json
scan के लिए एग्ज़िट कोड:
| कोड | अर्थ |
|---|---|
0 | कोई निष्कर्ष नहीं |
1 | निष्कर्ष का पता चला |
3 | उपकरण त्रुटि |
AST पुनर्लेखन का उपयोग करके हार्डकोडेड रहस्यों को सुधारता है। फाइलों को वहीं बदलता है।
# फिक्स लागू करें
autonoma fix src/
# लिखने से पहले पैच का पूर्वावलोकन करें
autonoma fix src/ --diff
# उपचार ऑडिट लॉग लिखें
autonoma fix src/ --report-out audit.json
fix के लिए एग्ज़िट कोड:
| कोड | अर्थ |
|---|---|
0 | कोई निष्कर्ष नहीं — रिपॉजिटरी पहले से साफ थी |
1 | उपचार के प्रयास से पहले निष्कर्ष मौजूद थे (उपचार सफल हो सकता है — FIXED/REFUSED गणना के लिए आउटपुट जांचें) |
3 | उपकरण त्रुटि |
fixकमांड1से बाहर निकलता है जब भी उपचार का प्रयास करने से पहले रहस्य मिले, चाहे पुनर्लेखन सफल हुआ हो या नहीं। यह जानबूझकर किया गया है: CI पाइपलाइनों को उस कमिट को चिह्नित करना चाहिए जहां रहस्य पेश किए गए थे, भले ही ऑटो-फिक्स के बाद। रिपॉजिटरी को साफ साबित करने के लिए बाद मेंautonoma scanचलाएं।
गिट इतिहास को उन रहस्यों के लिए स्कैन करता है जो कमिट किए गए और बाद में हटा दिए गए या बदल दिए गए।
[!NOTE] केवल पहचान। यह कमांड गिट इतिहास को फिर से नहीं लिखता या कमिट को संशोधित नहीं करता।
autonoma history-scan .
ये वे पैटर्न हैं जिन्हें Autonoma वास्तव में आज ठीक करता है।
# settings.py
SENDGRID_API_KEY = "sg-live-abc123xyz789"
DB_PASSWORD = "Pr0dAccess2024!"
autonoma fix .)# settings.py
import os
SENDGRID_API_KEY = os.environ["SENDGRID_API_KEY"]
DB_PASSWORD = os.environ["DB_PASSWORD"]
# f-string — अस्वीकृत क्योंकि पुनर्लेखन अर्थ बदल देगा
api_key = f"prefix_{BASE_KEY}"
# → REFUSED: refuse_fstring_mixed_expression
# Dict/nested value — अस्वीकृत क्योंकि लक्ष्य कोई साधारण असाइनमेंट नहीं है
DATABASES = {
"default": {"PASSWORD": "Pr0d@ccess2024!"}
}
# → REFUSED: unsupported assignment target type
अस्वीकृत निष्कर्ष JSON आउटपुट में रिपोर्ट किए जाते हैं और CI में गैर-शून्य निकास का कारण बनते हैं। अस्वीकृत निष्कर्ष वाली फ़ाइलें कभी संशोधित नहीं की जाती हैं।
साफ फ़ाइल पर फिर से चलाने से कोई बदलाव नहीं होता। पुनर्लेखन मूल इंडेंटेशन और टिप्पणियों को बनाए रखता है। import os केवल तब जोड़ा जाता है जब वह गायब हो।
यदि कोई रहस्य पाया जाता है तो आपके बिल्ड को विफल करने के लिए:
- name: Scan for secrets
run: autonoma scan .
analyze पश्चगामी संगतता के लिए बनाए रखा गया है। scan या fix पर माइग्रेट करें।
# 'autonoma scan' के समतुल्य
autonoma analyze src/ --detect-only
# 'autonoma fix' के समतुल्य
autonoma analyze src/ --auto-fix
API_KEY = "secret"class Config: PASS = "secret"connect(password="secret")A = B = "secret") या टपल अनपैकिंग।.env.example या एनवायरनमेंट अनुबंध नहीं मिलता।अस्वीकृत मामलों की सूचना JSON आउटपुट में दी जाती है और CI में गैर-शून्य एग्ज़िट कोड का कारण बनेगी। यदि उसमें कोई भी मुद्दा अस्वीकृत है तो फ़ाइल कभी संशोधित नहीं की जाती है।
<file>.bak के रूप में लिखे जाते हैं।SEC002 वर्तमान में क्रेडेंशियल वैल्यू पैटर्न को कीवर्ड-कंडीशन्ड रूटिंग लॉजिक के साथ जोड़ता है। अत्यधिक असामान्य वेरिएबल नामों को निर्दिष्ट क्रेडेंशियल वर्तमान में पता नहीं लगाए जा सकते हैं।
Autonoma जानबूझकर व्यापक एंट्रॉपी-केवल सीक्रेट डिटेक्शन से बचता है जब तक कि सटीकता प्रभाव को लेबल किए गए गलत-सकारात्मक कॉर्पस के विरुद्ध मापा न जा सके।
autonoma scan stdout पर एक detect-only रिपोर्ट आउटपुट करता है:
{
"schema_version": "1.0",
"tool_name": "autonoma",
"tool_version": "0.1.5",
"generated_at": "2026-03-24T12:00:00Z",
"mode": "detect-only",
"summary": {
"files_processed": 3,
"total_findings": 2,
"safe_to_fix": 1,
"refused": 1
},
"findings": [
{
"file": "settings.py",
"line": 4,
"pattern_type": "api_key",
"severity": "high",
"rule_id": "SEC002",
"safe_to_fix": true,
"suggested_env_var": "SENDGRID_API_KEY",
"refusal_reason": null,
"fingerprint": "sha256:abc123..."
}
]
}
MIT लाइसेंस
| पैटर्न | उदाहरण | व्यवहार | कारण |
|---|
| साधारण असाइनमेंट | api_key = "sk-abc123" | ठीक किया गया | नियतात्मक AST पुनर्लेखन |
| क्लास विशेषता | class C: SECRET = "abc" | ठीक किया गया | नियतात्मक AST पुनर्लेखन |
| कीवर्ड तर्क | connect(password="abc") | ठीक किया गया | नियतात्मक AST पुनर्लेखन |
| f-string | key = f"prefix_{v}" | अस्वीकृत | पुनर्लेखन रनटाइम व्यवहार बदल देगा |
| संयोजन | key = "sk-" + suffix | अस्वीकृत | पुनर्लेखन रनटाइम व्यवहार बदल देगा |
| Dict/nested मान | cfg = {"pass": "abc"} | अस्वीकृत | साधारण असाइनमेंट लक्ष्य नहीं |
| एकाधिक असाइनमेंट | A = B = "secret" | अस्वीकृत | अस्पष्ट लक्ष्य |
| पहले से सुरक्षित | key = os.getenv("KEY") | छोड़ दिया गया | कोई बदलाव आवश्यक नहीं |
.env.example गायब | कोई भी पैटर्न | अस्वीकृत | चर नाम प्राप्त करने के लिए कोई एनवी अनुबंध नहीं |