Database security
Skill JeremyMorgan/code-review-skills/skills/database-security
Examines all database interactions for injection, access control, encryption, and data-exposure risks. Use when auditing database and data-layer security.From its SKILL.md
npx -y skills add JeremyMorgan/code-review-skills --skill database-securityAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 12 stars12 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as CC0-1.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.2 KB, as published. Nobody here has run it
Target: $ARGUMENTS
If no target path is given above, review the entire codebase.
Database Security Audit
Examine ALL database interactions
Verify:
-
Parameterized queries or ORM usage
- Ensure all queries use placeholders (
?,$1,:param) or ORM bindings. - Flag any direct string concatenation in queries as CRITICAL.
- Ensure all queries use placeholders (
-
Connection string security
- No passwords or secrets hardcoded in code or committed to source control.
- Use environment variables or a secrets manager.
-
Database user permissions (principle of least privilege)
- Application account has only the rights it needs (e.g., no
SUPERUSER,DROP,GRANT). - Separate accounts for read-only, migrations, and admin.
- Application account has only the rights it needs (e.g., no
-
Sensitive data encryption at rest
- Verify disk-level/database-native encryption.
- Critical fields (e.g., SSN, tokens) use column-level encryption or tokenization.
-
PII handling compliance
- Personally identifiable information is minimized, redacted in logs, and handled per GDPR/CCPA.
- Retention/deletion policies exist and are enforced.
-
Query timeout configurations
- Query/statement timeouts configured at driver and DB server level to prevent runaway queries.
-
Connection pool settings
- Pool limits configured (min/max); no unbounded connections.
- Idle timeouts enforced to prevent exhaustion.
-
Transaction handling for consistency
- Transactions wrap multi-step operations.
- Rollback paths tested to prevent partial updates.
-
Audit logging for sensitive operations
- Log access to sensitive tables/fields, schema changes, permission changes, failed logins.
- Logs are centralized, immutable, and monitored.
-
NoSQL injection hardening (if applicable)
- User input never passed directly to filters.
$where,$ne,$gt,$oroperators blocked/sanitized.- ORM/driver sanitization enabled (e.g.,
mongoose.set('sanitizeFilter', true)).
-
Row/Tenant isolation
- Row-level security (Postgres RLS) or server-side ownership/tenant filters enforced.
- Multi-tenant queries scoped by server, not client input.
-
Least-privilege networking
- Database not publicly exposed; network ACLs, VPC, firewall/security groups in place.
- Only whitelisted application servers can connect.
-
TLS in transit & certificate validation
- DB connections use TLS (
sslmode=require/verify-fullor equivalent). - Certificates validated and rotated.
- DB connections use TLS (
-
Secret management & rotation
- Credentials stored in a secrets manager, rotated periodically.
- No static passwords in
.envfiles without protection.
-
Schema & integrity controls
- Foreign keys, unique constraints, and NOT NULL enforced.
- Ownership/tenant columns marked
NOT NULLand validated.
-
Field-level minimization
- Avoid
SELECT *; fetch only required fields. - Reduces exposure of sensitive columns.
- Avoid
-
Pagination & query limits
- Hard caps on
LIMIT/page size; prevent unbounded queries that scan entire tables.
- Hard caps on
-
Backup/restore security
- Backups encrypted, access-controlled, tested for restoration.
- No unprotected dumps in CI/CD or object storage.
-
Data retention & deletion
- Clear policies for retention, archival, and deletion of PII.
- Secure erasure when data is removed.
-
Migrations safety
- Migrations run with controlled privileges.
- Destructive operations reviewed; rollback plans exist.
-
ORM raw-query escape hatch review
- Any
queryRaw/sequelize.query/knex.rawusage audited. - Must still use parameterized bindings.
- Any
-
LIKE / regex input handling
- Special characters in user input escaped properly (
%,_, regex metacharacters). - Prevents pattern abuse and heavy queries.
- Special characters in user input escaped properly (
-
Query timeouts & resource guards
- Resource caps enforced (memory, work_mem, CPU).
- Prevent denial-of-service via expensive queries.
-
Audit & monitoring depth
- Privileged operations (DDL, GRANT, role changes) logged and alerted.
- Centralized monitoring with anomaly detection.
-
PII in logs/metrics
- ORM debug or query logs do not leak PII or secrets.
- Redaction/allowlisting enforced.
-
Indexing of sensitive data
- Sensitive fields (e.g., SSN, tokens) not indexed in plaintext.
- Use hashed/indexed tokens or partial indexes where needed.
-
Service/account lifecycle
- No shared admin accounts.
- Time-bound, purpose-specific service accounts.
- Periodic review of granted privileges.
-
Caching layers
- Sensitive data not cached in plaintext unless justified.
- Redis/Memcached require auth, not publicly exposed.
-
Analytics/ETL exports
- PII masked or de-identified before export.
- Exports encrypted, access-controlled, and scrubbed of secrets.
👉 Critical flags:
- Direct string concatenation in queries = CRITICAL.
- Passing raw user JSON into NoSQL queries without sanitization = CRITICAL.
Provide:
A structured finding report with the following for each issue:
Title, Severity (Critical/High/Medium/Low), CWE (if applicable), Evidence (file, function, line ranges), and a short Why it matters.
Exploitability notes and, where safe, a minimal PoC or reproduction steps (no real secrets).
Remediation: precise code-level fix or config change (snippets welcome), plus defense-in-depth guidance.
A summary risk score (0–10) and top 3–5 prioritized fixes that reduce risk fastest.
A checklist diff: which items from the “Check for” list are Pass/Fail/Not Applicable.
Constraints & style:
Be concrete and cite exact code locations and identifiers.
Prefer minimal, drop-in fix snippets over prose.
Do not invent files or functions that aren’t present; if context is missing, mark as Unable to verify and say what code would prove it.
Write this into a markdown file and place it in the audits/ folder.