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):
输出编码:
- ✅ 后端 (Spring Boot):
- 在将用户输入或从数据库取出的数据输出到HTML页面时,是否进行了HTML实体编码,防止XSS攻击?使用Thymeleaf、JSP等模板引擎时,默认是否已开启安全输出?
- 在输出到JavaScript上下文时,是否进行了JavaScript编码?
- 在输出到URL上下文时,是否进行了URL编码?
- 前端 (Vue):
- 使用
{{ data }}进行数据绑定时,Vue默认会进行HTML实体编码,防止XSS。但如果使用v-html指令,是否明确知道其风险,并确保内容来源安全可信或已在后端进行严格编码? - 动态绑定属性(如
href、src)时,是否确保绑定值是安全的,避免javascript:伪协议等攻击?
- 使用
- ✅ 后端 (Spring Boot):
二、认证与授权 (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传输,并设置了
Secure和HttpOnly标志(对Cookie而言),防止信息泄露和XSS获取? - Token是否设置了合适的过期时间?短期AccessToken配合长期RefreshToken,Refresh Token是否也妥善保管和校验?
- 用户登出、密码修改等操作后,是否立即销毁或使现有会话Token失效?
- 后端是否对所有请求都校验Token的合法性和有效性?
- Session ID或JWT Token是否通过HTTPS传输,并设置了
- ✅ 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: DENY或SAMEORIGIN(防止点击劫持)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安全是一个持续的过程。希望大家都能养成良好的安全编码习惯,从源头解决问题,让我们的项目更加健壮!