From soundcheck
Flags unsafe third-party API consumption patterns like unvalidated data in SQL insertion, HTML rendering, blind redirects, and code execution. Suggests schema validation, safe sinks, timeouts, size limits.
npx claudepluginhub thejefflarson/soundcheck --plugin soundcheckThis skill uses the workspace's default tool permissions.
Protects against blindly trusting data from third-party APIs. External API responses
Implements API schema validation with OpenAPI and JSON Schema to secure inputs/outputs, prevent injections, mass assignment, and data leaks in API gateways.
Implements API schema validation using OpenAPI and JSON Schema to enforce input/output contracts and prevent injection, mass assignment, and data exposure attacks.
Scans API code for OWASP Top 10 vulnerabilities: injection, BOLA, broken auth, mass assignment, excessive data exposure, missing rate limits, and weak validation.
Share bugs, ideas, or general feedback.
Protects against blindly trusting data from third-party APIs. External API responses can be tampered with (via MITM, compromised provider, or supply-chain attack), contain unexpected types or malicious payloads, or change without notice. Treating external data as trusted leads to injection, deserialization attacks, and business logic bypass.
data = requests.get(api_url).json(); db.execute(f"INSERT ... {data['name']}") — external data into SQLhtml := resp.Body; template.HTML(html) — rendering third-party HTML without sanitizationObject.assign(user, externalApiResponse) — merging unvalidated external fields into internal modelredirect(api_response["redirect_url"]) — following redirect from untrusted API response (open redirect / SSRF)exec(api_response["script"]) — executing code from external APIFlag the vulnerable code and explain the risk. Then suggest a fix that establishes these properties:
Anchor — shape, not implementation:
resp = http_get(url, timeout=10, follow_redirects=False)
require(len(resp.body) < MAX_BYTES)
data = validate(parse(resp.body), schema=ExpectedShape) # reject unknowns
use(data) # only validated fields reach sinks