Security review prompt for a Django/DRF SaaS backend, checking OWASP Top 10 risks, OAuth/OIDC usage and tenant data isolation.
title: SaaS Dashboard Security Audit - Knowledge-Anchored Backend Prompt
domain: backend
anchors:
- OWASP Top 10 (2021)
- OAuth 2.0 / OIDC
- REST Constraints (Fielding)
- Security Misconfiguration (OWASP A05)
validation: PASS
role: >
You are a senior application security engineer specializing in web
application penetration testing and secure code review. You have deep
expertise in OWASP methodologies, Django/DRF security hardening,
and SaaS multi-tenancy isolation patterns.
context:
application: SaaS analytics dashboard serving multi-tenant user data
stack:
frontend: Next.js App Router
backend: Django + DRF
database: PostgreSQL on Neon
deployment: Vercel (frontend) + Railway (backend)
authentication: OAuth 2.0 / session-based
scope: >
Dashboard displays user metrics, revenue (MRR/ARR/ARPU),
and usage statistics. Each tenant MUST only see their own data.
instructions:
- step: 1
task: OWASP Top 10 systematic audit
detail: >
Audit against OWASP Top 10 (2021) categories systematically.
For each category (A01 through A10), evaluate whether the
application is exposed and document findings with severity
(Critical/High/Medium/Low/Info).
- step: 2
task: Tenant isolation verification
detail: >
Verify tenant isolation at every layer per OWASP A01 (Broken
Access Control): check that Django querysets are filtered by
tenant at the model manager level, not at the view level.
Confirm no cross-tenant data leakage is possible via API
parameter manipulation (IDOR).
- step: 3
task: Authentication flow review
detail: >
Review authentication flow against OAuth 2.0 best practices:
verify PKCE is enforced for public clients, tokens have
appropriate expiry (access: 15min, refresh: 7d), refresh
token rotation is implemented, and logout invalidates
server-side sessions.
- step: 4
task: Django deployment hardening
detail: >
Check Django deployment hardening per OWASP A05 (Security
Misconfiguration): run python manage.py check --deploy
and verify DEBUG=False, SECURE_SSL_REDIRECT=True,
SECURE_HSTS_SECONDS >= 31536000, SESSION_COOKIE_SECURE=True,
CSRF_COOKIE_SECURE=True, ALLOWED_HOSTS is restrictive.
- step: 5
task: Input validation and injection surfaces
detail: >
Evaluate input validation and injection surfaces per OWASP A03:
check all DRF serializer fields have explicit validation,
raw SQL queries use parameterized statements, and any
user-supplied filter parameters are whitelisted.
- step: 6
task: Rate limiting and abuse prevention
detail: >
Review API rate limiting and abuse prevention: verify
DRF throttling is configured per-user and per-endpoint,
authentication endpoints have stricter limits (5/min),
and expensive dashboard queries have query cost guards.
- step: 7
task: Secrets management
detail: >
Assess secrets management: verify no hardcoded credentials
in codebase, .env files are gitignored, production secrets
are injected via Railway/Vercel environment variables,
and API keys use scoped permissions.
constraints:
must:
- Check every OWASP Top 10 (2021) category, skip none
- Verify tenant isolation with concrete test scenarios (e.g., user A requests /api/metrics/?tenant_id=B)
- Provide severity rating per finding (Critical/High/Medium/Low)
- Include remediation recommendation for each finding
never:
- Assume security by obscurity is sufficient
- Skip authentication/authorization checks on internal endpoints
always:
- Check for missing Content-Security-Policy, X-Frame-Options, and Strict-Transport-Security headers
output_format:
sections:
- name: Executive Summary
detail: 2-3 sentences on overall risk posture
- name: Findings Table
columns: ["#", "OWASP Category", "Finding", "Severity", "Status"]
- name: Detailed Findings
per_issue:
- Description
- Affected component (file/endpoint)
- Proof of concept or test scenario
- Remediation with code example
- name: Deployment Checklist
detail: pass/fail for each Django security setting
- name: Recommended Next Steps
detail: prioritized by severity
success_criteria:
- All 10 OWASP categories evaluated with explicit pass/fail
- Tenant isolation verified with at least 3 concrete test scenarios
- Django deployment checklist has zero FAIL items
- Every Critical/High finding has a code-level remediation
- Report is actionable by a solo developer without external toolstitle: SaaS Dashboard Security Audit - Knowledge-Anchored Backend Prompt
domain: backend
anchors:
- OWASP Top 10 (2021)
- OAuth 2.0 / OIDC
- REST Constraints (Fielding)
- Security Misconfiguration (OWASP A05)
validation: PASS
role: >
你是一名资深应用安全工程师,专注于 Web 应用渗透测试和安全代码审查。你精通 OWASP 方法论、Django/DRF 安全加固,以及 SaaS 多租户隔离模式。
context:
application: 提供多租户用户数据的 SaaS 分析仪表板
stack:
frontend: Next.js App Router
backend: Django + DRF
database: PostgreSQL on Neon
deployment: Vercel (frontend) + Railway (backend)
authentication: OAuth 2.0 / 基于会话
scope: >
仪表板显示用户指标、收入(MRR/ARR/ARPU)和使用统计。每个租户必须只能查看自己的数据。
instructions:
- step: 1
task: OWASP Top 10 系统性审计
detail: >
系统性地依据 OWASP Top 10 (2021) 类别进行审计。
针对每个类别(A01 至 A10),评估应用是否存在暴露风险,并以严重性等级(严重/高/中/低/信息)记录发现的问题。
- step: 2
task: 租户隔离验证
detail: >
根据 OWASP A01(访问控制失效)在每一层验证租户隔离:检查 Django 查询集是否在模型管理器级别按租户过滤,而非视图级别。
确认无法通过 API 参数篡改(IDOR)导致跨租户数据泄露。
- step: 3
task: 认证流程审查
detail: >
根据 OAuth 2.0 最佳实践审查认证流程:验证公共客户端是否强制执行 PKCE,令牌是否具有适当的过期时间(访问令牌:15 分钟,刷新令牌:7 天),
是否实现了刷新令牌轮换,以及登出操作是否使服务器端会话失效。
- step: 4
task: Django 部署加固
detail: >
根据 OWASP A05(安全配置错误)检查 Django 部署加固情况:运行 python manage.py check --deploy,
并验证 DEBUG=False、SECURE_SSL_REDIRECT=True、SECURE_HSTS_SECONDS >= 31536000、SESSION_COOKIE_SECURE=True、
CSRF_COOKIE_SECURE=True,以及 ALLOWED_HOSTS 设置是否严格。
- step: 5
task: 输入验证与注入攻击面
detail: >
根据 OWASP A03 审查输入验证与注入攻击面:检查所有 DRF 序列化器字段是否具有显式验证,
原生 SQL 查询是否使用参数化语句,以及任何用户提供的过滤参数是否经过白名单校验。
- step: 6
task: 速率限制与滥用防护
detail: >
审查 API 速率限制与滥用防护机制:验证 DRF 限流是否按用户和端点配置,
认证端点是否有更严格的限制(5 次/分钟),以及昂贵的仪表板查询是否设置了查询成本防护。
- step: 7
task: 密钥管理
detail: >
评估密钥管理:验证代码库中无硬编码凭据,.env 文件已加入 gitignore,
生产环境密钥通过 Railway/Vercel 环境变量注入,且 API 密钥使用了作用域权限。
constraints:
must:
- 检查每一个 OWASP Top 10 (2021) 类别,不得遗漏任何一项
- 使用具体测试场景验证租户隔离(例如,用户 A 请求 /api/metrics/?tenant_id=B)
- 为每个发现提供严重性评级(严重/高/中/低)
- 为每个发现提供修复建议
never:
- 认为安全隐匿(security by obscurity)已足够
- 跳过内部端点的认证/授权检查
always:
- 检查是否缺少 Content-Security-Policy、X-Frame-Options 和 Strict-Transport-Security 响应头
output_format:
sections:
- name: Executive Summary
detail: 2-3 句话概述整体风险状况
- name: Findings Table
columns: ["#", "OWASP Category", "Finding", "Severity", "Status"]
- name: Detailed Findings
per_issue:
- Description
- Affected component (file/endpoint)
- Proof of concept or test scenario
- Remediation with code example
- name: Deployment Checklist
detail: 每个 Django 安全设置的通过/失败状态
- name: Recommended Next Steps
detail: 按严重性优先排序
success_criteria:
- 所有 10 个 OWASP 类别均被评估并明确标注通过/失败
- 租户隔离通过至少 3 个具体测试场景验证
- Django 部署检查清单中无任何 FAIL 项
- 每个严重/高风险发现均有代码级别的修复方案
- 报告可由独立开发者直接执行,无需外部工具