搜索/修改后端代码时,防范通过上传和用户输入发起的攻击

修改后端代码时,防范通过上传和用户输入发起的攻击

让 AI 修改处理上传文件、归档或请求数据的后端代码时使用。它会追踪外部数据的去向,在使用前验证,把同样的修复应用到所有相似的代码路径,最后以安全检查清单和通过的 lint 与测试收尾。

要使用这个AI规则
## 修改前,追踪外部数据的去向并找出相似的代码路径 即使用户已经通过身份验证,也要假定上传的文件、归档内容、请求参数、清单、元数据和设备标识符可能受攻击者控制。 在更改敏感代码路径之前: 1. 确定不可信数据从何处进入、如何转换,以及它能够到达的每项文件操作、进程、数据库、渲染、重定向和网络操作。 2. 搜索执行相同操作的同类实现。范围包括替代格式、API与网页视图、二进制与源代码流程,以及旧调用位置。 3. 重用或扩展集中式安全辅助程序,不要在视图和处理程序中分散设置临时检查。 4. 如果能够查阅以往的漏洞模式,就进行审查,尤其要关注只保护一条路径的不完整修复。 5. 保持导入和本地约定一致,然后运行所需的lint与针对性测试,直到它们成功退出。 如果等效路径仍然能够到达存在漏洞的操作,安全修复就是不完整的。 ## 在入口验证请求数据和上传文件,并要求登录与权限 在原始输入成为路径、命令参数、查询值、重定向、渲染字符串或出站主机之前对其进行验证。 - 使用带类型的表单或模式作为主要验证层。 - 对有效值属于已知有限集合的参数使用有限选项字段。 - 将字段特定的拒绝逻辑放在验证层中,并在验证失败时返回标准错误响应。 - 在将标识符用于路径或查找之前,按照其精确格式进行验证。 - 检查上传内容的魔数、大小限制和扩展名允许列表;仅检查扩展名并不充分。 - 将清单和元数据中的值视为不可信输入。 敏感处理程序必须应用所有适用的控制措施: - 身份验证; - 基于角色或权限的授权; - 明确的HTTP方法限制; - 针对由浏览器发起的状态变更实施CSRF保护。 不得禁用模板转义,也不得将不可信内容标记为安全内容。在自动转义模板之外构建输出时,应根据目标上下文对值进行编码。 ## 让文件路径和 ZIP/TAR 解压始终留在指定的文件夹内 对文件系统路径使用两层防护: 1. 拒绝遍历片段、绝对路径、编码绕过和无效字符等危险的原始形式。 2. 构建路径后,对其进行规范解析,并验证它仍位于预期根目录内。 当操作预期读取普通文件时,应在读取文件系统对象之前拒绝符号链接、命名管道、设备文件和其他意外类型。 对于TAR解压: - 优先使用由运行环境提供、按成员处理且能够识别类型的解压过滤器,使其拒绝遍历、绝对路径、设备文件和逃逸到目标目录之外的链接。 - 不得依赖仅检查名称或仅使用`abspath`的检查;它无法解析符号链接。 - 如果没有可用的安全内置过滤器,应拒绝符号链接和硬链接,使用`realpath`解析目标位置,并在解压每个成员之前立即进行验证。 - 避免先批量验证再批量解压,因为文件系统状态可能在两个阶段之间发生变化。 对于ZIP解压: - 解压前检查每个成员名称是否存在遍历。 - 解析计划使用的目标位置,并验证它位于解压根目录内。 - 只有该成员通过上述两项检查后才能解压。 每个失败的防护检查都必须通过`continue`、`return`或`raise`停止不安全操作。只记录警告而不阻止执行,不构成安全控制。 ## 按使用场景让用户输入变得无害,例如 SQL 或 shell 命令 - 以列表形式传递子进程参数。绝不要把不可信输入插入shell命令字符串。 - 使用参数化的ORM或查询构建器操作。绝不要通过字符串格式化来构造SQL。 - 在自动转义上下文之外渲染用户可控内容之前,先对其进行转义。 - 在显示SVG等主动内容格式之前,先进行净化处理。 - 从用户派生的日志字段中去除换行符和控制字符,以防止日志注入。 - 将文件名放入响应标头之前,先生成安全的文件名。 - 只允许经过验证的相对重定向目标。 - 发起出站请求之前,解析并验证主机,拒绝环回、私有、链路本地、组播和其他禁止的地址范围。 应根据具体上下文进行验证,而不是使用单一的通用净化程序。对数据库过滤器安全的值,在文件名、shell命令、HTML片段、日志条目、重定向或URL中仍可能不安全。 ## 用安全检查清单收尾,并为每一项给出依据 对于涉及文件I/O或用户输入的每项变更,验证其中适用的项目: - [ ] 在构建路径之前验证原始输入。 - [ ] 以规范方式解析构建后的路径,并确保它位于预期根目录内。 - [ ] 在读取前拒绝意外的链接、管道和文件类型。 - [ ] 在解压前单独验证每个归档成员。 - [ ] 传递shell参数时不使用字符串插值。 - [ ] 对渲染值进行转义,并对主动内容进行净化处理。 - [ ] 限制出站主机和重定向目标。 - [ ] 净化用户派生的日志值。 - [ ] 数据库访问使用参数化操作。 - [ ] 每个拒绝分支都会阻止危险操作。 - [ ] 对等效代码路径应用相同的修复。 - [ ] 针对性测试覆盖可接受输入、应拒绝的输入和绕过尝试。 - [ ] lint和相关测试均以退出代码0完成。 报告每项已完成检查的证据,并指出所有无法验证的路径。