ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

FckSignups 提交数据验证逻辑详解:如何防止非法数据入库

FckSignups 提交数据验证逻辑详解:如何防止非法数据入库 FckSignups 提交数据验证逻辑详解如何防止非法数据入库【免费下载链接】FckSignupsA list of tools that are open-source, in-browser, and require no-signups!项目地址: https://gitcode.com/GitHub_Trending/fc/FckSignupsFckSignups 是一个收录开源、浏览器内免注册工具no-signup tools的精选目录。任何人都可以在网页上提交自己发现的新工具而每一份提交最终都会写入项目的数据文件 tools.json。那么问题来了如何防止用户提交空字段、非法 URL 甚至超长垃圾文本这个项目用三道关卡构建了一套完整的数据验证体系——前端表单拦截、服务端Cloudflare Worker深度校验、自动化脚本终审层层设防确保只有合法数据才能入库。提交数据的全链路三道防线一条数据从用户提交到最终入库要经过下面这条完整链路阶段负责模块防住什么第一道前端表单src/constants/ModalConfigs.tsx空字段、格式错误的 URL、乱选分类第二道Worker 服务端cloudflare-worker/urlHandlers/handleSubmitTool.ts一切绕过前端的手段必填项、URL 合法性、长度上限第三道入库自动化management_tools/addToolAutomation.py结构不完整的数据、缺少仓库链接的提交这种设计符合安全领域的经典原则永远不要相信客户端。前端校验只为体验服务真正的数据验证逻辑全部放在服务端即使攻击者用工具直接发送请求也过不了第二道防线。第一道关卡前端表单的必填项与类型约束打开提交表单你会发现每个字段都被严格定义在 ModalConfigs.tsx 中必填标记name、description、url、category均设置了required: true用户不填就无法提交URL 类型字段url字段类型为url浏览器会在提交时自动校验链接格式下拉选择分类category是select类型只能从 Productivity、Design Graphics 等预定义选项中挑选从源头上杜绝了自由发挥式的非法分类。这一层让 99% 的手滑型错误在浏览器里就被拦截了。第二道关卡Worker 服务端的深度验证核心用户点击提交后数据被 POST 到 Cloudflare Worker 的/submit-tool端点。请求由 worker.ts 路由分发然后进入真正的校验函数validate()handleSubmitTool.ts。它按顺序执行四步检查1. 载体检查请求体必须是合法对象if (!data || typeof data ! object) throw new Error(Invalid payload)如果攻击者发送的是纯字符串、数字或null直接抛出Invalid payload返回 400 状态码。2. 必填字段三重检查对name、description、url、category四个字段每个都要同时满足三个条件字段存在、类型是字符串、去除首尾空格后仍非空。任何一个不满足就抛出Missing required field: xxx。注意这里有个容易被忽略的细节—— 纯空格也会被判定为缺失因为.trim()之后变空了。3. URL 合法性校验用new URL()解析url字段解析失败则抛出Invalid URL。这意味着https://excalidraw.com能通过而excalidraw或javascript:alert(1)这类字符串会被拒绝。github字段是可选的但如果填了就必须是合法 URL否则抛出Invalid GitHub URL。4. 清洗与长度截断通过验证后数据还会被消毒name截断到 100 字符description截断到 500 字符——超长垃圾文本到此为止tags数组逐项转为字符串、去除空格并过滤掉空值filter(Boolean)保证标签列表干净所有字段统一trim()首尾空格无处藏身。验证一旦失败Worker 会立即返回400 状态码和具体错误信息如Missing required field: url让调用方知道问题出在哪而验证通过但调用 GitHub API 失败时则返回502避免把服务端的锅甩给用户。顺手拦截跨域攻击CORS 来源白名单除了数据本身Worker 还验证请求来自哪里。utils.ts 中维护了一个来源白名单只有fcksignups.com、nosignups.net和本地开发端口5173/4173的 Origin 会被信任。来自其他网站的跨域提交会被浏览器直接阻断这是防止任意第三方网站利用本站接口刷 Issue的关键一道锁。报告与建议接口同样的验证标准报告工具和推荐工具走的是完全一致的验证模式报告工具handleReportTool.ts 要求toolId和report必填并分别截断到 128 和 512 字符推荐工具handleSuggestTool.ts 要求toolIdea必填且截断到 100 字符。三个端点共用同一套对象检查 → 必填检查 → 长度截断的验证模板维护成本极低也保证了标准统一。第三道关卡自动化脚本的终审通过 Worker 的提交会被打包成一条带标签的 GitHub Issue其中嵌入了用;;分隔的机器可读数据串SUBMISSION标签。维护者运行 addToolAutomation.py 时它会做最后把关字段数必须恰好等于 6 个多一个少一个都直接报错终止GitHub 仓库链接不能是占位符—非开源工具FOSS 之外无法自动入库需要人工处理。此外真正写入tools.json前还会人工确认分类、标签和描述并由 githubBridge.py 从 API 实时拉取真实的 Star 数和开源许可证——也就是说Star 数不是用户报的而是项目自己查的杜绝了虚报。新手可抄的作业这套设计的 3 个亮点验证下沉到服务端前端表单只是体验优化Worker 里的validate()才是守门员这是任何涉及用户输入的项目都该遵守的铁律截断而非拒绝对超长内容采用slice()截断而不是报错用户体验更友好同时上限值100/500/512明确写在代码里便于审查机器可读 人工终审的混合模式自动提交生成结构化数据串降低出错率但入库前保留人工确认分类与描述兼顾了效率与质量。看懂这套逻辑后你可以打开 management_tools/addTool.py 中的slugify函数看看工具 ID 是如何从名称清洗生成小写化、去特殊字符、空格转连字符的——这正是清洗思想在数据标识上的又一次应用。【免费下载链接】FckSignupsA list of tools that are open-source, in-browser, and require no-signups!项目地址: https://gitcode.com/GitHub_Trending/fc/FckSignups创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表