是的。免费扫描是被动扫描。SniffPup 会加载你的页面及其附带的 JavaScript,就像普通浏览器一样,外加一个包含 /.env 和 /.git/config 等已知路径的固定短列表。它从不登录,从不发送攻击载荷,也从不使用它找到的密钥。
工具概况
快速了解工具核心信息
什么是SniffPup
面向 Lovable、Bolt、Cursor、Replit 和 v0 构建的应用进行被动式安全扫描,检查公开可见代码与响应,发现暴露的 API 密钥(含 Supabase service_role 密钥)、公开的 .env 和 .git 文件、公开 source map 及缺失的安全响应头,适用于 Web 应用上线后的安全监控。
你是「SniffPup」的开发者?
徽标是「万智云集」的收录证明,也是品质认证;嵌入官网即为产品挂上权威背书,还能为详情页带回访客、提升热度指数。
哪些人适合使用SniffPup
为什么选择SniffPup
如何使用SniffPup
常见问题
关于本工具的常见疑问解答
不。我们存储发现结果时会隐藏密钥,绝不会存储完整值。对于 Pro 数据库检查,我们只存储表或桶是否可读及其行数,绝不存储行内容。
一个应用的每个发现结果,附带通俗易懂的解释以及针对 Lovable、Cursor、Bolt 和 Claude Code 的复制粘贴修复提示词,外加 30 天免费重新扫描,以便检查修复效果。一次性付费。无需账户,无需订阅。
您可以随时通过计费门户取消在网站上购买的订阅;订阅将在计费周期结束时结束。在应用内购买的订单将通过您付款的商店进行取消和退款。所有销售均不退款,除非法律要求或我们错误收费。
没有扫描器能保证这一点。被动扫描能快速发现常见且代价高昂的错误。它不是渗透测试或代码审计。
将您的域名发送至 abuse@sniffpup.com,我们将屏蔽对其的扫描。
在浏览器的隐私窗口中打开您实时域名的 /.env 和 /.git/config 并读取内容。文件内容(KEY=value 或 [core] Git 配置)表明它是公开的。返回 404 或您的正常应用页面是没问题的。SPA 可能会返回 200 状态码,且内容与首页相同;那不是该文件。
在处理程序使用 Stripe 官方库验证原始请求体、Stripe-Signature 头以及端点 whsec_ 签名密钥之前,停止处理事件。在处理负载之前拒绝签名检查失败的情况,且不要对无效签名返回 2xx。验证成功后,快速返回 2xx 并按事件 ID 去重。对您拥有的网站进行免费的 SniffPup 扫描可以帮助找到剩余暴露的 sk_ 或 whsec_ 字符串,但它无法证明 Webhook 验证、确认密钥在所有地方都不存在,或发送事件。
在 Resend 控制台中删除密钥(删除会立即撤销),创建仅服务器可用的替代密钥,并优先使用发送权限,可选限制为单个域名。对于收件箱,发送权限密钥只能调用回复线程邮件、转发线程邮件、创建草稿和发送草稿。检查日志和邮件中您未发送的记录,从客户端代码和历史记录中移除密钥,然后重新扫描您拥有的网站。被动扫描可以帮助找到剩余暴露的密钥。它无法确认密钥在所有地方都不存在。仅移除代码无法阻止密钥的泄露。
移除 npx @stripe/mcp 条目及其 --api-key 参数,使用 OAuth(或带有 Agent 标记的代理 API 密钥,作为 bearer token 传递)将 Cursor 重新连接到 https://mcp.stripe.com,在沙盒中测试,然后在控制台中使旧密钥过期——如果配置曾被提交、粘贴或分享,则立即过期。请在 2026 年 11 月 30 日前迁移:从 12 月起,Stripe MCP 将不再接受带有 Agent 标签的全访问权限密钥和受限密钥。SniffPup 的网站扫描无法查看您的本地 mcp.json,但它可以检查相同的密钥是否也泄露到了您的实时网站。
将密钥保存在 Supabase Edge Function 中,使用 Lovable 的 Supabase secrets 流程。Lovable 前端代码会发送到浏览器;在组件或前端环境变量中隐藏值并不能保持其私密性。
将秘密 API 调用移到服务器或边缘函数。在基于 Vite 的 Bolt 前端中,客户端代码使用的 VITE_ 变量在打包产物中是公开的。前端 .env 值不是秘密存储。
打开 Firestore 的 Rules 标签页,将公开或测试模式访问替换为匹配你应用用户和数据的规则。该邮件指向访问规则;隐藏 Firebase Web API 密钥不会修复它们。
将秘密文件模式添加到 .cursorignore,并同时保留在 .gitignore 中。Cursor 使用忽略规则将文件从索引和 AI 上下文中排除,但这是尽力而为,不是安全边界。
SniffPup 是一款被动安全扫描器,适用于使用 Lovable、Bolt、Cursor、Replit 和 v0 等 AI 工具构建的 Web 应用。你输入线上 URL,我们的侦探博美犬 Ember 会检查该网站向任何访客展示的内容:泄露的密钥、公开文件、公开的 source map、缺失的安全响应头等。它是被动的、只读的、由外向内:从不登录,不需要访问你的代码,也从不更改你网站上的任何内容。
SniffPup 只会获取您的网站已经向公众提供的内容,就像浏览器一样。它不会登录、模糊测试、发送利用载荷,也不会使用它找到的任何密钥。免费扫描会对您的网站发出大约 60 个或更少的请求,并且针对每个目标网站进行速率限制。您已验证的网站的付费扫描会检查您页面链接和站点地图中找到的最多 5 个(Starter)、25 个(Pro)或 50 个(Ultimate)页面(它遵守 robots.txt 并且从不跟踪站外链接),每多检查一个页面大约需要多发出一个请求。如果您的网站使用 Supabase 或 Firebase,它还会使用您网站已经部署的公开配置向该项目发出最多 15 个只读请求(无写入操作,无行数据),以及针对您电子邮件记录的几次 DNS 查询。
不能。SniffPup 仅扫描实时 Web URL。它无法扫描原生 iOS 或 Android 应用。如果您的移动应用有 Web 版本或营销网站,SniffPup 可以扫描该 URL。
是的,如果该应用发布在实时 Web URL 上,例如 bolt.host 地址或您自己的域名。SniffPup 会检查该网站向任何访客提供的内容。它不能替代 Bolt 自身的安全审计和数据库检查,后者可以看到您的代码和数据库设置。
保持 Cursor 对终端命令和 MCP 的默认批准开启,将密钥放在 .env 中以及 NEXT_PUBLIC_ 或 VITE_ 变量之外,阅读差异,然后扫描实时 URL。Cursor 的代理安全文档描述了编辑器护栏。它们不会检查已部署的站点。每个关键问题都提供免费完整修复(没有关键问题?另一个修复也是免费的)。
是的,如果该应用部署在实时 Web URL 上,例如 Vercel 或 Netlify 地址或您自己的域名。SniffPup 会检查该网站向任何访客提供的内容。它不会读取您的代码,因此请将其与代码审查工具(如 Cursor 的 Bugbot)配合使用。
是的,前提是该应用部署在可访问的线上网址,例如 Vercel 或 Netlify 地址或你自己的域名。SniffPup 会检查该网站向任何访客提供的内容:前端中的密钥和开放文件。它不会审计你本地的 Claude Code 会话、读取你的源代码仓库或查看你的 RLS 策略文本,因此请将其与你自己的 RLS、服务端认证和代码审查检查配合使用。
是的,前提是该应用发布在可访问的线上网址,例如 replit.app 地址或你自己的域名,且访问权限设置为 Public。SniffPup 会检查该网站向任何访客提供的内容。它不能替代 Replit 的 Security Center 扫描,后者可以查看你的代码和软件包。
添加 Content-Security-Policy HTTP 响应头,然后重新发布。在 Replit Static Deployment 上,通过根目录 .replit 文件中的 deployment.responseHeaders 进行设置。在 Autoscale 或 Reserved VM 上,在应用程序中设置该响应头。HTML 中的 meta 标签不是 HTTP 响应头,响应头检查仍会报告其缺失。对你拥有的线上网址进行免费的 SniffPup 扫描是被动且只读的;它会检查响应头是否存在,但不会评估策略的严格程度。它不是源代码、RLS 或安全审计。
是的,前提是该应用发布在可访问的线上网址,例如 vercel.app 地址或你自己的域名,且访客无需登录即可打开。SniffPup 会检查该网站向任何访客提供的内容。它不能替代 v0 自身的检查,后者可以在代码生成时查看代码。
是的,前提是该应用发布在访客无需登录即可打开的网址,例如你的 base44.app 地址或你自己的域名。SniffPup 会检查该网站向任何访客提供的内容:页面及其 JavaScript 中泄露的密钥、公开的 .env 和 .git 文件、source map、安全响应头、Cookie 和 HTTPS。它不会测试 Base44 的数据权限或调用你的后端函数,因此也请运行 Base44 自带的安全扫描。对于 Private 或 Workspace 应用,外部扫描只能看到登录页面。
是的。Vite 在构建时会把前端用到的每个 VITE_ 变量复制进 JavaScript 打包文件,因此任何访客都能读取(NEXT_PUBLIC_ 和 REACT_APP_ 也是同样的机制)。像 Supabase anon key 或 Stripe pk_ key 这类可公开的密钥放在那里没问题。私密密钥(OpenAI、Stripe sk_、Supabase service_role)应放在服务端函数中;如果已经泄露,请立即更换。免费的 SniffPup 扫描会检查你线上站点的 JavaScript 中是否含有私密密钥。
在未登录状态下打开应用,确认所有含个人数据的表都启用了 RLS,删除任何遗留的 using (true) 策略,并测试陌生人用你的 anon key 无法 select 这些行。然后对你自己的线上 URL 运行一次免费的 SniffPup 扫描,检查前端泄露的密钥和开放文件。SniffPup 不会读取你的策略,也不能证明站点是安全的。
先看 Supabase Security Advisor,然后用公开密钥对每个敏感表发起未登录请求。在通过之前不要分享链接。
在公开存储桶中,任何人只要拿到对象 URL 就能无需认证下载。列出是另一回事:storage.objects 上的 SELECT 策略决定调用者能列出哪些对象。把私密文件设为私有,将策略限定到每个用户文件夹,并使用带有效期的签名 URL。
默认可以:public schema 中的函数可通过 /rest/v1/rpc 用你的 anon key 调用,因为 execute 权限授予了 public。请执行 revoke execute on function public.my_function(arg types) from anon, public; 只授予需要它的角色,在 security definer 函数内检查 auth.uid() 并设置 search_path。
是的。当 verify_jwt = false(或使用 --no-verify-jwt)时,任何拿到 URL 的人都能调用它,因此你的代码是唯一的检查。仅在签名 webhook、cron 或使用密钥校验的服务调用,以及健康检查等公开端点时保持关闭。对于面向用户的函数,请重新开启并在处理程序内部校验用户,然后以未登录状态用 curl 测试。SniffPup 的扫描读取的是你的线上站点,而不是你的函数设置。
Postgres 使用 OR 组合宽松的 RLS 策略,因此遗留的 using (true) 策略仍会让所有人进入,在旁边添加更严格的策略不会改变任何结果。用 select * from pg_policies where qual = 'true' or with_check = 'true' 找到它们,删除开放的那条,然后以未登录状态和第二个用户身份测试。SniffPup 的扫描读取的是你的线上站点,而不是你的策略。
是的,Firebase Web 配置中的 apiKey 仅用于标识你的项目;Firebase 文档说明它可以放在代码中。你的数据由 Firestore、Realtime Database 和 Storage 安全规则以及 App Check 保护,因此开放的测试模式规则才是真正的泄露点。在 Google Cloud 中将该密钥限制为仅可用于 Firebase API,并且绝不要暴露服务账号密钥。
不覆盖。Postgres 行级安全从不适用于 TRUNCATE,而 GRANT ALL(42501 错误的常见修复方式)会授予 anon 和 authenticated 角色 TRUNCATE 权限,并且在 Supabase 2026 年 10 月 30 日授权变更之前创建的表默认仍拥有该权限。请从这两个角色撤销 truncate、references 和 trigger,只授予你需要的动词。
是的。运行 next build 时,Next.js 会将每个 NEXT_PUBLIC_ 值内联到发送给浏览器的 JavaScript 中。Supabase anon 或 publishable 密钥(开启 RLS)以及 Stripe publishable 密钥放在那里没问题。Supabase service_role 密钥、Stripe sk_live 密钥以及 OpenAI 或其他 AI 密钥应放在 Route Handler 或仅服务端代码中。如果某个密钥已经发布,请替换它并重新部署。
RLS 选择的是行而不是列,因此像 id = auth.uid() 这样的更新策略会让用户更改自己行中的任何列,包括 role。从 authenticated 角色撤销对该表的 update 权限,只授予对 display_name 等安全列的 update 权限,并保留行策略。或者将角色保存在用户无法写入的单独表或 app_metadata 中,绝不要放在 user_metadata 中。
这是 Security Advisor 的 lint 0011:函数没有自己的 search_path,因此使用调用者的 search_path。运行 alter function public.my_function(arg types) set search_path = ''; 并在函数体中使用其模式(如 public.profiles)编写每个表和函数。这对 security definer 函数最为重要,因为它们以所有者身份运行并绕过 RLS。然后重新运行 Security Advisor。
隐藏注册页面是不够的,因为你的 Supabase URL 和公钥在网站的 JavaScript 中,任何人都可以直接调用 Supabase Auth。在项目的 Auth 设置中关闭“允许新用户注册”,改为邀请用户,保持匿名登录关闭,并在每个表上保持 RLS 开启,因为每个已登录用户都会获得 authenticated 角色。
默认情况下,Postgres 视图使用视图所有者的权限检查其表,而 Supabase 视图通常由 postgres 拥有,postgres 会绕过 RLS。因此,public 模式中的视图可能返回你的策略所隐藏的行。在 Postgres 15+ 上设置 security_invoker = true(alter view public.my_view set (security_invoker = true));否则从 anon 和 authenticated 撤销对视图的 select 权限,或将其移动到 API 不暴露的模式中。SECURITY DEFINER 函数有同样的陷阱:从 public 和 anon 撤销 execute 权限并固定 search_path。
Devin Desktop(Windsurf 自 2026 年 6 月 2 日起的名称)可以将文件排除在代理之外,并可以在执行终端命令前询问。这些控制措施并不能阻止已提交的 .env 文件或部署站点上的公开表。在未登录状态下检查实时 URL,然后扫描你拥有的站点。
是的,如果应用部署在实时 Web URL 上,例如 windsurf.build、netlify.app 或 vercel.app 地址,或者是您自己的域名。Windsurf 于 2026 年 6 月 2 日更名为 Devin Desktop;它是同一个编辑器。SniffPup 会检查您的网站向任何访客提供的内容:页面及其 JavaScript 中的泄露密钥、公开的 .env 和 .git 文件、源映射、安全头、Cookie 和 HTTPS,以及使用您网站已内置的公开配置对 Supabase 或 Firebase 的读取访问权限。它无法看到您的源代码或编辑器设置,因此请将 .env 排除在 git 之外,并开启 Supabase 行级安全(RLS)。
从 Lovable 的快速扫描和深度扫描开始:它们会审查您的数据库规则和依赖项,深度扫描还会审查您的应用程序代码,这是任何外部扫描器都无法看到的。Lovable 的文档说明它们不能替代彻底的安全审查。对外发布的 URL 进行被动扫描回答的是另一个问题:您的实时网站向每位访客发送了什么,例如其 JavaScript 中的密钥、公开的 .env 或 .git 文件、头信息和 HTTPS。它无法看到您的代码或 RLS 策略。请同时运行两者。
打开项目的 Security 视图并运行两种内置扫描:快速扫描(数据库访问规则、关键 npm 漏洞、MCP 服务器检查;打开发布对话框时也会运行)和深度扫描(审查您的应用代码)。Lovable 的文档说明运行它们是免费的。首先修复关键发现,以未登录状态和第二用户身份测试您的数据,将密钥保存在 Secrets 中,然后使用免费的 SniffPup 扫描从外部扫描您发布的 URL。
Lovable 自己的安全文档说明,快速扫描和深度扫描有助于发现常见问题,但不能保证完全安全。请运行两种扫描,以未登录状态测试 Supabase,并扫描发布的 URL。每个关键问题都免费提供完整修复(没有关键问题?则另一个修复免费)。
Bolt 有两个检查。数据库安全检查(数据库图标,然后 Security)在所有计划上都可用,使用与 Supabase Security Advisor 相同的检查。项目安全审计(Publish,然后 Run security audit)在付费计划上可用,审查您的代码和数据库,并且不使用该按钮的 token。修复任何您无意中出现的 RLS 策略“始终为真”警告,以未登录状态和第二用户身份测试您的数据,然后使用免费的 SniffPup 扫描扫描您的实时 URL。
检查三个地方。你的线上站点:JavaScript 中没有密钥,没有公开的 .env 或 .git 文件,没有公开的 source map,并且设置了安全响应头(免费的 SniffPup 扫描会从外部检查这些)。你的数据库:每个 Supabase 表都启用了行级安全(Row Level Security),并在登出状态和以两个不同用户身份下测试过,同时使用 Supabase Security Advisor。你的代码:认证、支付和管理检查在服务端进行,使用你的构建工具自带的扫描或代码审查。SniffPup 无法看到你的代码或数据库策略,100 分意味着在我们的检查中未发现问题,而非安全性的证明。
可以,如果你粘贴代码。Payments Doctor(免费)会读取你粘贴的 Stripe 结账、成功页面和 webhook 代码,并指出常见错误:从成功页面而非签名 webhook 开启付费访问、webhook 不验证 Stripe 签名、重试可能导致重复授权或扣款、退款和争议未移除访问权限、以及浏览器代码中的密钥。每个问题都附带修复步骤和针对 Lovable、Cursor、Bolt 或 Claude Code 的提示词。Solo 及以上版本增加更多规则,并在你修改代码后重新检查。你的代码仅在该次响应中于内存中检查,不会被存储、记录或用于训练。它不会连接你的 Stripe 账户或读取你的仓库,因此也请在 Stripe 测试模式下测试购买、退款和取消。
可以。将免费的 SniffPup Scan action(uses: sniffpup/scan-action@v1)添加为部署后运行的工作流中的一个步骤。它从外部对你已部署站点的公开 URL 运行与网站相同的免费被动扫描:它从不登录、提交表单或攻击任何内容,也不读取你仓库的代码。它不需要 API 密钥或机密,只需你的 URL 和同意:"true" 以确认你拥有该站点或有权测试它。它会打印你的 Sniff 分数和发现问题的标题(绝不包含机密或证据),链接到完整报告,并设置输出 score、report-url、critical、high 和 passed。设置 threshold 以在分数低于你选择的数字时使任务失败;默认情况下它从不因分数而失败,无法运行的扫描仅为警告,除非你设置 fail-on-scan-error。它使用与免费网站扫描相同的限制,因此每次部署运行一次最佳。通过你的阈值意味着在我们的检查中未发现问题,而非你的应用是安全的证明。
可以。将 SniffPup 的 MCP 服务器(https://sniffpup.com/api/mcp)添加到 Claude Code、Cursor 或任何支持 HTTP 远程 MCP 服务器的 AI 工具。无需登录或令牌,你的 AI 工具会获得一个免费工具 scan_site,它运行与网站相同的免费被动扫描:它只读取任何访客浏览器可见的内容。你的 AI 工具必须在扫描前与你确认你拥有该站点或有权测试它。它会获得你的 Sniff 分数、发现的问题,以及每个严重问题及其掩码证据、修复步骤和修复提示词(如果没有严重问题,则附带一个其他问题及其修复),以便它可以修复你的代码并再次扫描。它与网站免费扫描具有相同的限制。在 Claude Code 中,运行:claude mcp add --transport http sniffpup https://sniffpup.com/api/mcp。在 Cursor 中,将地址添加到 .cursor/mcp.json。在付费计划中使用 API 令牌时,同一服务器还会列出你的站点并以完整结果扫描你已验证的站点。100 分意味着在我们的检查中未发现问题,而非你的应用是安全的证明。
不需要。对于任何可完整查看的发现,使用“Proof it worked”。它仅在你的站点上重新运行那一项检查,并显示扫描之前看到的内容和现在看到的内容。当问题消失时,它会显示已验证修复。它适用于暴露的文件、source map、安全响应头、https 重定向、泄露的密钥、公开的开发服务器、开放的模型列表、生命周期结束的 Node.js 版本、低于最新安全版本的受支持 Node.js 版本、开放的 /_ipx 图像代理以及随 JavaScript 发布的模型指令。对于其他任何情况,请运行完整重新扫描。应用中也有相同的检查。重新检查不会改变你保存的分数。
首先在提供商处轮换或撤销密钥,因为从代码中删除它并不能消除泄露。然后检查提供商的使用日志,将需要密钥的代码移至服务器函数,重新部署并重新扫描您的实时站点。Supabase 的 anon 密钥本意是公开的;service_role 和 sb_secret 密钥则不是。该指南链接了 OpenAI、Stripe、Supabase、AWS 和 GitHub 密钥的分步页面。
在 Google AI Studio 中创建一个新的 Gemini 密钥,将其移至您的服务器,然后在 Google Cloud 控制台中禁用或删除泄露的密钥。检查使用情况和计费,并在 AI Studio Spend 页面上设置每月项目支出上限。
首先在 Claude Console API 密钥页面删除泄露的密钥(⋯ → Delete API key)。然后创建一个新的仅服务器密钥,检查使用情况和日志,设置支出限制,如果可疑活动持续,请联系支持团队。将新密钥保存在密钥管理器或仅服务器环境变量中,绝不要放在客户端打包的环境变量中,如 VITE_ 或 NEXT_PUBLIC_。
首先在 ElevenLabs 中删除或禁用泄露的密钥(您的 API 密钥页面,或工作区服务账户用于服务账户密钥)。然后创建一个仅包含您所需权限范围和信用额度的替换密钥,将其保存在您的服务器或主机密钥中(绝不要放在 VITE_ 或 NEXT_PUBLIC_ 变量中),并重新部署。检查您的使用情况,查找您未执行的活动,并从您的账户邮箱发送电子邮件至 support@elevenlabs.io,附上时间和请求 ID。退款不保证,因此请直接向支持团队询问未经授权的使用情况。
SniffPup 是 Ember 和 Saru LLC 的产品,这是一家位于北卡罗来纳州的小型独立公司。Ember,我们文案中的侦探,是一只真正的黑色博美犬,也是我们的吉祥物。您可以通过 support@sniffpup.com 联系我们。
它们做的是不同的工作,而且可以很好地配合使用。Gitleaks 在 git 仓库和文件中查找密码、API 密钥和令牌等机密信息。TruffleHog 在 Git 及许多其他位置查找机密信息,可对 800 多种机密类型进行分类,并能检查发现的机密是否仍然有效。GitHub secret scanning 会扫描你仓库的整个 Git 历史以查找硬编码凭据,并在公共仓库上免费自动运行。Supabase Security Advisor 从仪表板(以及 CLI)检查你的 Supabase 项目数据库,例如 public schema 中禁用了 RLS 的表。SniffPup 关注的是另一面:你已部署上线的应用,从外部、以被动且只读的方式,就像任何访客的浏览器所看到的那样。内置在 JavaScript 中的密钥、公开的 .env 文件和 source map 正是在这里暴露出来,即使它们从未被提交到仓库。为了获得最佳覆盖范围,请扫描你的仓库、检查你的数据库,并检查线上站点。
你的 HTML、内联脚本和同源 JavaScript 包中的机密信息(例如 OpenAI、Anthropic、OpenRouter、Replicate、Stripe、Resend、AWS、GitHub 和 Slack 密钥、私钥块、数据库连接字符串,以及 Supabase service_role 和 sb_secret 密钥),在报告中会进行脱敏处理。公开的 /.env 文件(仅报告变量名)、/.git/config、/.git/HEAD、/.DS_Store 和 /.npmrc,以及 .env、.git-credentials、.aws/credentials、.vscode/sftp.json、.htpasswd、SQL 数据库转储文件(/backup.sql、/dump.sql、/db.sql、/database.sql)、/backup.zip、docker-compose.yml 和 phpinfo.php 的备份副本(仅当响应确实看起来像该文件时才报告;仅报告名称,绝不报告值)。你的 JavaScript 所指向的 source map。安全响应头(Content-Security-Policy、Strict-Transport-Security、X-Frame-Options、X-Content-Type-Options、Referrer-Policy)、Cookie 标志以及 HTTP 到 HTTPS 的重定向。你的 HTTPS 证书,通过一次正常的 TLS 连接检查:是否有效以及还剩多少天(Full Fix Report 会补充颁发者以及是否覆盖你的域名)。存在已知漏洞的过时 JavaScript 库(旧版 jQuery、lodash、AngularJS 及 60 多个其他库),仅当我们能读取确切版本时才报告;免费扫描会完整显示最严重的一个,Full Fix Report 会列出全部。以及 AI 爬虫能读取到什么:浏览器看到的原始 HTML 与 GPTBot 看到的对比、robots.txt 中的 AI 爬虫屏蔽、llms.txt、标题、meta 描述和 h1。
不能单独运行。这些检查都是一次免费主扫描的组成部分:泄露的密钥和前端环境变量、CORS、过时的 JavaScript 库、AI 爬虫访问(robots.txt、llms.txt 以及你的服务器是否拒绝 GPTBot、ClaudeBot 或 PerplexityBot)和电子邮件欺骗(SPF、DMARC 和 DKIM,仅进行 DNS 查询)。一次扫描会同时运行所有这些检查,报告按严重程度排序,以便你直接跳转到关心的部分。单独的工具仅用于主扫描无法从外部完成的事情,例如检查你的代码、你的 Supabase 项目或你的 Payments 设置。
浏览器会阻止访客访问证书已过期、不受信任或为其他域名签发的站点,因此 SniffPup 也这样做:它会报告证书问题,并且在该次扫描中不检查其他任何内容。修复或续期证书(你的主机通常会自动完成),然后再次扫描以进行完整检查。
不会。它只检查你的 JavaScript 包所引用的那一个 source map,而不是为每个文件检查 .map URL。
免费扫描会按标题和严重程度列出发现的所有问题,并且对每个严重问题免费提供完整修复方案(说明、证据和修复提示词);如果没有严重问题,则另一个问题的修复方案免费。一次性 $9 的完整修复报告会解锁每个发现项的说明、证据和可复制粘贴的修复提示词(适用于 Lovable、Cursor、Bolt 或 Claude Code),并允许你将报告下载为 PDF 或 Markdown 文件(付费方案也可以下载自己的扫描报告)。
一个根据你的报告生成的简短规则文件,适用于 Cursor(.cursor/rules)、Claude Code(CLAUDE.md 或 .claude/rules)、Lovable 或 Bolt(项目设置 → 知识)。你的编码工具会在每次请求时读取它,因此更不容易再次引入扫描发现的问题。规则按问题类型选取,因此文件中不包含你报告中的密钥、证据或其他值。它降低问题重复出现的概率;但它本身并不能让应用变得安全,所以请持续重新扫描。它随完整修复报告、付费方案和完整的 Payments Doctor 检查一起提供。
每个方案都能看到所有崩溃,免费版可获得严重崩溃的修复步骤和 AI 提示词。Solo 及以上方案可获得所有修复,并在出现新类型崩溃时收到手机提醒,崩溃报告会显示在手机浏览器的“我的扫描”下(目前尚未在 iOS 或 Android 应用中显示)。
不会。它只会发送一封包含该次扫描评分、发现项简短摘要和返回你报告的链接的电子邮件,并且不会创建账户。安全提示和产品更新是另一个默认未勾选的选项;保持未勾选,你就只会收到你请求的那封邮件。
不能检查策略本身:免费扫描无法读取你的行级安全策略。它会从外部测试这些策略的结果。当你的网站公开其 Supabase 项目 URL 和公共 anon 或 publishable 密钥(该密钥本就是公开的)时,免费扫描会读取该密钥可见的表列表,并对每张表发送一次只读 HEAD 请求(最多 8 次),以了解匿名访客是否能读取至少一行。它从不下载或统计行数,也从不写入。它还会将前端中出现 service_role 或 sb_secret 密钥标记为严重问题,因为这些密钥会绕过 RLS。它不会测试写入操作,也不会测试已登录用户读取彼此行的情况。
可以,前提是你连接了它。登录 SniffPup,打开 Sniff & Fix,在 Supabase 自己的页面上以只读权限连接你的 Supabase 项目。随后 SniffPup 会读取你的 Security Advisor 结果、哪些表启用了行级安全、你的策略规则、有风险的函数、存储桶设置和登录设置。它绝不会读取你表中的行数据,也绝不会更改你的项目。任何 SniffPup 账户均可免费使用该检查:你会获得一个百分制评分(计算方式与站点 Sniff 评分相同),并看到所有发现项,每个严重问题都附带修复步骤、SQL 和 AI 提示词。其他发现项的修复、上次结果和重新检查属于 Solo 及以上套餐。
不会。你的 ZIP 在浏览器标签页内读取,绝不会被上传。你的代码中的任何内容都不会发送给 SniffPup。
这些查询需要我们的服务器向公共数据库询问你的包名和版本。为了将所有内容保留在你的浏览器中,ZIP 扫描会跳过这些查询。仓库扫描会执行这些查询。
可以。将你的项目文件夹打包为 ZIP,然后在 ZIP 代码扫描页面上选择它。摘要(计数和类型)免费;包含修复步骤和提示词的完整列表属于 Solo 及以上套餐。
你的 Cloud Firestore、Cloud Storage 和 Realtime Database 安全规则。它会标记对任何人开放的规则(if true 或无任何条件)、在某个日期前开放的测试模式规则,以及任何已登录用户都能绕过的规则。你会获得一个百分制评分;严重问题免费附带修复方案,Solo 及以上套餐可获得所有修复方案。
不能。如果你粘贴规则,它只读取你粘贴的文本。如果你通过 Google 连接,它会请求只读权限,并且只读取你的项目列表以及你的 Firestore 和 Storage 安全规则,绝不会读取你数据库或文件中的数据,也无法更改任何内容。断开连接会立即终止访问权限。
不是。我们只是将你的规则作为文本读取;我们不会运行它们。请同时在 Firebase Rules Playground 或模拟器中进行测试。
我们的指南提供了大多数应用所需模式的复制粘贴策略:每个用户的私有行、公开读取但仅所有者可写、团队访问(使用 security definer 函数以避免策略循环)、用户无法自行授予的管理员角色、仅插入表单以及按用户的存储文件夹。每个策略都遵循 Supabase 官方文档,并附带未登录测试和双用户测试。请根据你的表和列名进行调整,并在依赖它们之前进行测试。
可以,通过仅插入设置:开启行级安全,撤销 anon 和 authenticated 的所有权限,仅授予表单列的插入权限,并添加带有 with check 规则的插入策略。如果没有 select 授权或策略,任何人都无法通过 API 读取条目,包括刚刚提交的人。任何人仍然可以直接调用端点,因此如果垃圾信息很重要,请通过检查 CAPTCHA 的服务器路由发送表单。
不安全。用户可以编辑自己的 user_metadata,因此信任它的策略会让任何人将自己设为管理员。请使用用户无法编辑的 app_metadata,或仅你的服务器可以写入的角色表。
从 2026 年 10 月 30 日起,Supabase 对所有现有项目应用新的默认设置(新项目自 2026 年 5 月 30 日起已如此):public schema 中的新表不会自动获得授权,因此在你授予访问权限之前,Data API 无法访问它们。现有表保留其授权,所以那些原本就过于开放的旧表会保持开放:也要检查这些表。只给每个角色授予其所需的最小权限(anon、authenticated、service_role),并在同一个迁移中开启行级安全(RLS)并添加策略。只有授权而没有 RLS,会让任何持有你公开 anon key 的人访问每一行。
是的,anon key 和更新的 sb_publishable_ key 本就是公开的,会随前端一起发布。它们只能访问行级安全和表授权所允许的内容,因此请为每个暴露的表开启 RLS 并配置按所有者限定的策略,并以未登录状态和两个不同用户身份进行测试。切勿暴露 service_role 或 sb_secret_ key,因为它们会绕过 RLS。对于可以按行表述的规则,RLS 已经足够;请将支付、管理操作、限流或多步写入放到会校验用户的服务端路由之后,并且无论如何都保持 RLS 开启,这样即使某张表被遗忘也会默认拒绝访问。
它从外部检查规则的结果,仅使用你网站已经发布的公开 Firebase 配置。作为匿名访客,它会对你的 Realtime Database 根节点做一次浅读取,在四个常见的 Firestore 集合(users、profiles、orders 和 messages)中各请求一个文档名称(不请求字段),并请求列出你 Storage 存储桶中的一个文件。它只记录每个响应是否为空,从不写入。它无法读取规则本身,也无法测试已登录用户的访问。
它是 Pro 计划的一部分,仅在你通过 DNS TXT 记录或 /.well-known 文件证明拥有该网站后运行。它使用你网站的公开 anon key,只读。它会列出你的 API 暴露的表,并检查其中最多 30 张表(如果该列表不可用,则尝试 users、profiles 和 orders 等常见名称),对每张表请求行数而不下载任何行。它会报告匿名访客可以读取的表。它还会检查你的 GraphQL API(pg_graphql):是否响应未登录访客、其 schema 是否公开、为未登录访客列出了哪些写操作(从不执行),以及表检查尚未统计的最多 10 张表的行数。对于存储,它会列出标记为公开的存储桶,并对其中最多 10 个检查未登录访客是否可以列出文件,仅以计数形式(从不获取文件名或内容)。它从不插入、更新或删除任何内容,也从不存储行数据。
它是 Pro 计划的一部分,与深度检查一起运行,仅在你证明拥有该网站后执行。它仅使用你网站已经提供的公开 Firebase 配置,且从不登录。作为未登录访客,它会针对最多 20 个名称发送读取请求(仅 GET):从你网站 JavaScript 中找到的 Firestore 集合名称和 Realtime Database 路径名称,然后是 users、orders 和 messages 等常见名称。Firestore 读取仅请求文档名称,每个集合最多 50 个;Realtime Database 读取为浅读取(仅键)。它仅报告计数,例如“users:可读,50+ 个文档”,并为每个问题提供 Firebase 安全规则修复提示。它从不写入或删除任何内容,也不存储任何内容。
不是。它只测试匿名读取。它不测试写入、已登录用户读取彼此的行,或它找不到的表。还要运行 Supabase 的 Security Advisor,并查找 RLS Disabled in Public、Permissive RLS Policy 和 Security Definer View。
可以,在 Pro 上验证你的站点后。从你的仪表板打开 Supabase 报告,并粘贴你的 Security Advisor 结果(lints JSON)。你会得到一份报告,包含你最新的外部扫描、深度检查和 Advisor 项目、一个用于 Lovable、Cursor、Bolt 或 Claude Code 的修复提示词,以及一个 Markdown 下载。在网站上,你粘贴的内容在你的浏览器中读取,永远不会发送给我们;在我们的应用中,它仅发送到我们的服务器以构建报告,并且不会被存储。它涵盖这些检查能看到的内容,因此不是保证。
使用 Supabase 自己的 Security Advisor 来检查项目内部。它在 Studio 中运行,从 CLI(supabase db advisors)、通过 Supabase MCP get_advisors 工具或 Management API 运行,并标记诸如 RLS 关闭的表、始终为真的策略以及 security definer 视图或函数等问题。它看不到你的网站,因此添加对你实时 URL 的外部检查:免费的 SniffPup 扫描会查找泄露的 service_role 或 sb_secret 密钥、公开的 .env 和 .git 文件以及源映射。
搜索你实时网站的 JavaScript(DevTools 搜索,或 Network 标签中对 supabase.co 请求的 apikey 头)中的 sb_publishable_、sb_secret_ 和 eyJ。publishable 或旧版 anon 密钥是公开的;secret(sb_secret_)或旧版 service_role 密钥会绕过行级安全,必须替换。对于 eyJ 密钥,在你自己的电脑上解码中间部分并读取 role 字段。免费的 SniffPup 扫描会执行此搜索,并将 secret 或 service_role 密钥标记为严重。
不止一种,因为每种看到不同的地方。Supabase Security Advisor 从内部读取你的数据库(RLS 关闭、始终为真的策略、security definer 视图和函数)。迁移 linter 和 pgTAP 测试(supabase test db)在部署前捕获错误。外部扫描器检查你的实时网站向陌生人提供的内容:SniffPup 的免费扫描会查找你 JavaScript 中的 service_role 和 sb_secret 密钥、公开的 .env 和 .git 文件,以及匿名访问者是否可以在最多 8 个表中读取行,只读,不下载行。它看不到你的策略,因此请与 Security Advisor 一起使用。
可以,前提是你是该网站的已验证所有者:登录、验证你的网站,当你的最新扫描评分达到 80 或更高时,你的扫描结果(在网页端或应用中)会提供一个免费的评分徽章(/badge/ .svg),链接到一个公开的评分页面(/score/ )。该功能默认关闭,需你手动开启;它只显示评分和扫描日期,绝不显示发现的问题;如果你的评分降到 80 以下,或上次扫描已超过 30 天,它会切换为普通的“扫描你的应用”徽章。它不是认证,也不是保证。
评分 100 意味着 SniffPup 在对你的线上网站进行检查时没有发现问题。这并不证明你的应用是安全的:SniffPup 看不到你的源代码、服务器逻辑、数据库策略或登录之后的任何内容。
不是。SniffPup 检查的是你网站上公开可见的内容。报告无问题并不保证安全。它看不到你的源代码、服务器逻辑、数据库策略或登录之后的任何内容。
仓库扫描会读取你的代码,标记出任何人都可以在未登录或无任何限制的情况下调用的 AI 路由,并告诉你如何修复。它从不向你的网站发送消息,因此看不到你在主机控制台中设置的限制。网站扫描还会在你页面调用看似 AI 路由时进行提示,但不会向其发送任何内容。
扫描是免费的。完整修复报告为每个应用一次性 $9,包含该应用 30 天的重新扫描,且这 $9 可作为抵扣,用于你在 30 天内通过我们网站购买任何套餐的首次付款。免费扫描中每个严重问题的修复都是免费的(如果没有严重问题,则另一个修复免费)。套餐:Solo $7/月(1 个应用、1 个扫描 API 令牌和 MCP 服务器),Starter $15/月(5 个应用、每个已验证网站最多扫描 5 个页面、每分钟正常运行时间检查以及每月 PDF 报告),Pro $29/月(15 个应用、最多 25 个页面以及深度 Supabase 和 Firebase 检查),Ultimate $49/月(30 个应用、最多 50 个页面;尚未开售)。Solo 每天重新扫描。Starter、Pro 和 Ultimate 每小时重新检查已验证网站(验证前:Starter 每天一次,Pro 和 Ultimate 每 12 小时一次)。免费套餐每周重新扫描你保存的 1 个应用,并且仅在出现新的严重问题时通过电子邮件通知你。年付:$70、$150、$290 和 $490。价格以美元计;结账时可能会加收税费。除法律要求或我们向你错误收费外,所有销售均为最终销售。
扫描次数有限制,以免一个人对网站造成过多请求。在扫描按钮下方,你会看到今天还剩多少次扫描以及下次扫描的倒计时。你可以立即重新扫描网站以检查修复情况;之后每使用一次扫描,大约一小时后恢复。未登录账户时,每个邮箱地址每天最多可免费扫描 10 次;登录后每天最多 20 次。
可以,在网站上操作。各套餐包含席位且不额外收费:Starter 包含除你之外的 2 名队友,Pro 为 5 名,Ultimate 为 10 名;Solo 和 Free 仅限你本人。通过“账户 → 团队”按邮箱邀请他人。每位队友使用自己的免费 SniffPup 账户,可以查看你网站的报告、修复建议、评分历史和 Supabase 检查,但不能添加网站、运行扫描、下载报告或更改设置。邀请仅有效一次,仅限你邀请的邮箱,并在 7 天后过期。如果你降级到更小的套餐,最新加入的队友会被暂停(而非移除),直到你再次拥有相应席位。只有你付费;没有按席位收费。
可以。你的套餐跟随你的账户:无论你是在我们的网站还是应用内购买,只要使用同一账户登录,它就能在网页端和我们的应用中使用。购买前请先登录:当你以有效套餐登录时,我们不会向你提供第二个套餐,因此你不会被重复收费。
用户口碑
真实用户评价
