ShipSafeFull checklist (23 checks)

Abuse and cost

Make LLM features resist prompt injection

Treat user and fetched text as untrusted, give tools least privilege, confirm destructive actions, and never put secrets in system prompts.

Why it matters

If user input or fetched content (web pages, emails, documents) reaches a model that can call tools or read data, that text can instruct the model to leak data or take actions. There is no reliable filter for this, so limit what a tricked model can do.

How to fix it

  1. Treat user and fetched content as data. Keep it separate from your instructions and never let it change tool permissions.
  2. Give each tool the least access it needs, scoped to the current user, and enforce that scope in your code, not in the prompt.
  3. Require a human to confirm destructive or costly actions such as deleting data, sending email or making payments.
  4. Never put API keys or secrets in the system prompt; assume it can be extracted.
  5. Don't render model output as raw HTML, and be careful with model-generated links and images, which can leak data in URLs.

How to verify

Questions

Can a better system prompt stop prompt injection?
No. It can reduce it, but the reliable defences are limiting tool access and confirming risky actions.

Related checks

Tick it off in the full checklist

Get new checks by email

New checks and real leak post-mortems, about once a month. No spam.