WEBKT

Spring Boot与Vue应用Web安全编码自查清单

73 0 0 0

最近项目安全审计报告出来,一大堆中高危漏洞,确实让人“头大”。很多时候不是我们不懂安全,而是开发过程中缺乏一个系统性的检查机制。为了避免下次再被审计报告“锤”,我整理了一份针对Spring Boot后端和Vue前端的Web安全编码自查清单,希望大家在开发和代码Review时对照着检查,把安全问题扼杀在萌芽状态。


Web安全编码自查清单 (Spring Boot & Vue)

一、输入验证与输出编码 (Input Validation & Output Encoding)

这是最常见也最关键的一环,防止注入和XSS攻击。

  • 输入验证:

    • 后端 (Spring Boot):
      • 所有用户输入(包括URL参数、请求体、Header、Cookie)是否都进行了严格的类型、长度、格式、范围校验?例如,电话号码必须是数字且长度固定,邮箱必须符合邮箱格式。
      • ✅ 是否对特殊字符进行了有效过滤或转义?特别是SQL查询、Shell命令、文件路径等敏感上下文。
      • ✅ 使用Spring Validation等框架时,是否充分利用了其校验能力,并自定义了校验规则以满足业务安全需求?
      • ✅ 对于上传文件,是否校验了文件类型(MIME Type)、大小,并严格控制了上传目录的权限和执行权限?
    • 前端 (Vue):
      • ✅ 在客户端进行初步输入校验,提供即时反馈,提升用户体验,但不依赖前端校验作为唯一安全措施。
      • ✅ 避免直接将用户输入作为HTML内容或JS代码渲染。
  • 输出编码:

    • 后端 (Spring Boot):
      • 在将用户输入或从数据库取出的数据输出到HTML页面时,是否进行了HTML实体编码,防止XSS攻击?使用Thymeleaf、JSP等模板引擎时,默认是否已开启安全输出?
      • 在输出到JavaScript上下文时,是否进行了JavaScript编码
      • 在输出到URL上下文时,是否进行了URL编码
    • 前端 (Vue):
      • 使用{{ data }}进行数据绑定时,Vue默认会进行HTML实体编码,防止XSS。但如果使用v-html指令,是否明确知道其风险,并确保内容来源安全可信或已在后端进行严格编码?
      • 动态绑定属性(如hrefsrc)时,是否确保绑定值是安全的,避免javascript:伪协议等攻击?

二、认证与授权 (Authentication & Authorization)

确保只有合法用户能访问被允许的资源。

  • 认证:
    • 密码策略: 是否强制用户使用强密码(复杂度、长度),并定期要求更新?
    • 密码存储: 密码是否使用安全的哈希算法(如Bcrypt、Argon2)加盐存储,绝不存储明文或可逆加密?
    • 防暴力破解: 登录接口是否有限制尝试次数、验证码、锁定账户等机制?
    • 会话管理: Session ID或JWT Token是否在HTTPS下传输,并设置了合适的有效期?是否在用户注销或密码修改后使旧会话失效?
  • 授权:
    • 最小权限原则: 用户或角色是否只被授予完成其任务所需的最小权限?
    • 后端 (Spring Boot):
      • 所有需要授权的接口是否都通过Spring Security等框架进行了权限校验
      • 是否在后端对所有敏感操作(增、删、改)进行了权限校验,即使前端已做了限制?
      • 是否存在越权访问漏洞(水平越权、垂直越权)?例如,用户A能否通过修改ID访问用户B的数据?
    • 前端 (Vue):
      • 前端仅仅是根据用户权限展示或隐藏UI元素,绝不能依赖前端控制授权

三、会话管理 (Session Management)

保护用户会话的完整性和安全性。

  • Session ID / Token安全:
    • Session ID或JWT Token是否通过HTTPS传输,并设置了SecureHttpOnly标志(对Cookie而言),防止信息泄露和XSS获取?
    • Token是否设置了合适的过期时间?短期AccessToken配合长期RefreshToken,Refresh Token是否也妥善保管和校验?
    • 用户登出、密码修改等操作后,是否立即销毁或使现有会话Token失效?
    • 后端是否对所有请求都校验Token的合法性有效性
  • CSRF防护:
    • 对于所有状态变更请求(POST, PUT, DELETE),是否采用了CSRF Token(后端生成,前端携带)或SameSite Cookie等机制进行防护?Spring Security默认提供CSRF防护。
    • 前端 (Vue): 确保AJAX请求携带CSRF Token。

四、安全配置 (Security Configuration)

合理配置服务器、框架和应用程序,关闭不必要的功能。

  • Spring Boot配置:
    • 是否关闭了不必要的默认端点(如/actuator的敏感信息)?如需开放,是否加了认证授权?
    • 是否合理配置了HTTPS?强制使用HTTPS传输。
      • 安全Header: 后端是否设置了以下HTTP响应头?
      • X-Content-Type-Options: nosniff (防止MIME类型嗅探)
      • X-Frame-Options: DENYSAMEORIGIN (防止点击劫持)
      • X-XSS-Protection: 1; mode=block (浏览器XSS防护)
      • Content-Security-Policy (CSP,有效对抗XSS和数据注入)
      • Strict-Transport-Security (HSTS,强制客户端使用HTTPS)
    • ✅ 禁用或限制了默认的错误页面,避免泄露技术栈信息。
  • Vue配置:
    • 生产环境构建时,是否移除了console.log和Sourcemap等可能泄露信息的调试代码?
    • 是否合理配置了CORS,只允许可信的源进行跨域访问?

五、数据保护 (Data Protection)

保护敏感数据的机密性和完整性。

  • 敏感数据存储: 数据库中是否加密存储所有敏感个人信息(如身份证号、银行卡号)?
  • 数据传输: 所有敏感数据传输是否都通过HTTPS进行加密?
  • 日志记录: 日志中是否避免记录敏感信息(如密码、身份证号、Session ID)?

六、依赖管理与安全更新 (Dependency Management & Security Updates)

第三方库也可能是漏洞的来源。

  • 定期更新: 项目所使用的所有第三方库和框架(Spring Boot、Spring Security、Vue、Webpack、NPM包等)是否定期检查并更新到最新稳定版本,以修复已知安全漏洞?
  • 漏洞扫描: 是否使用工具(如OWASP Dependency-Check)对项目依赖进行安全扫描?

七、错误处理与日志记录 (Error Handling & Logging)

  • 错误处理:
    • 生产环境的错误信息是否经过通用化处理,避免直接向用户或日志输出详细的堆栈信息和系统内部错误,泄露过多敏感信息?
    • 自定义错误页面是否友好且不泄露信息?
  • 日志记录:
    • 是否记录了关键的安全事件(如登录失败、权限变更、敏感操作),以便审计和追踪?
    • 日志文件是否存储在安全的位置,并有适当的访问控制?

这份清单只是一个起点,Web安全是一个持续的过程。希望大家都能养成良好的安全编码习惯,从源头解决问题,让我们的项目更加健壮!

码农小安 Web安全安全编码

评论点评