Harden XSS escaping and encrypt Claude API key at rest
- results.js: add esc() helper and apply to all scan-derived fields (name, account_name, folder, source, modified, label, img alt) across card/list/preview/subject-lookup/related views. Scan-derived strings can carry attacker-controlled markup (e.g. a OneDrive file named with HTML), so they must be escaped before innerHTML/attribute embedding. Also escape the related-docs onclick JSON to match the delete/redact " pattern. - cpr_detector._placeholder_svg: escape label/name before embedding — served as image/svg+xml via /api/thumb?name=, so an unescaped value was a reflected-XSS vector when the URL is opened directly. - cpr_detector: remove 44-line unreachable duplicate of the face-detection body left inside _extract_audio_metadata after its return. - app_config: encrypt claude_api_key at rest with the machine-keyed Fernet (same as the SMTP password); add get_claude_api_key() for decryption. Legacy plaintext keys still read and are re-encrypted on next save. Update readers in document_scanner.py and routes/app_routes.py. 201 tests pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1903115e02
commit
b6d2915d49
5 files changed
+48
-65
No files matched your search
+8
-1
@@ -343,10 +343,17 @@ def save_claude_config(enabled: bool, api_key: "str | None" = None) -> None:
|
||||
cfg = _load_config()
|
||||
cfg["claude_ner"] = bool(enabled)
|
||||
if api_key is not None:
|
||||
cfg["claude_api_key"] = api_key
|
||||
# Encrypt at rest with the machine-keyed Fernet (same as the SMTP
|
||||
# password). Falls back to plaintext only if cryptography is missing.
|
||||
cfg["claude_api_key"] = _encrypt_password(api_key) if api_key else ""
|
||||
_save_config(cfg)
|
||||
|
||||
|
||||
def get_claude_api_key() -> str:
|
||||
"""Return the decrypted Claude API key (handles legacy plaintext)."""
|
||||
return _decrypt_password(_load_config().get("claude_api_key", ""))
|
||||
|
||||
|
||||
# ── Profile storage (15a) ─────────────────────────────────────────────────────
|
||||
_SETTINGS_PATH = _DATA_DIR / "settings.json"
|
||||
_SRC_TOGGLES_PATH = _DATA_DIR / "src_toggles.json"
|
||||
|
||||
Reference in new issue
Block a user