一、代码层面的安全
1. 禁止硬编码敏感信息
密码、密钥、数据库账号、Token 绝不写死在代码、配置文件、注释里,统一用配置中心、环境变量、密钥管理中心存放。
(1) 规避硬编码的正确写法
- 普通配置:放入
yml/properties配置文件 - 敏感账号密码:放入配置中心(Nacos/Apollo)
- 环境地址:使用环境变量
- 公共常量:统一抽
Constant常量类 - 秘钥、数据库密码:加密存放
2. 接口参数脱敏
手机号、身份证、银行卡、邮箱日志输出脱敏,日志不打印明文隐私数据。
(1) 脱敏的实现方式
-
**工具类手动脱敏:**写通用脱敏工具方法,接收字符串截取拼接,业务调用处理。
-
**Jackson 注解脱敏:**实体字段上加注解,序列化自动脱敏,无需手动写代码。
-
**全局统一拦截:**统一返回结果切面,在返回给前端之前统一批量脱敏。
-
日志脱敏: 自定义日志转换器,日志不打印明文,避免隐私泄露。
(2) 使用场景
- 后端查询列表、详情接口返回前端
- 操作日志、业务日志打印
- 数据导出、消息推送、短信展示
- 第三方接口对外透出用户信息
3. 接口安全校验
接口安全目的:防止非法访问、参数篡改、请求重放、恶意刷接口、数据泄露、越权操作。
(1) 常用校验方式
① Token 令牌校验(最常用)
- 登录成功下发JWT/Token
- 每次请求请求头携带 Token
- 后端校验是否有效、是否过期、是否篡改
- 无 Token / 无效直接拦截拒绝访问
② 时间戳防重放
请求携带当前时间戳,后端校验
- 超出5 分钟直接判定过期失效
- 防止抓包后重复恶意调用接口
③ 签名验签(对外三方接口必备)
- 双方约定密钥 secret
- 请求参数 + 时间戳 + 密钥拼接做 MD5/SHA 加密生成 sign
- 后端用同样规则重新加密比对签名
- 不一致直接拦截,防参数篡改
④ 请求来源白名单
- 限制 IP 白名单、域名白名单
- 只允许指定服务 / 内网调用,禁止外网非法访问
⑤ 接口限流防刷
- 单 IP / 账号限制访问频率
- 防止恶意高频请求压垮服务器
4. SQL 防注入
SQL注入:用户恶意输入特殊字符,拼接进 SQL 语句,篡改查询逻辑,越权查数据、删改库表。
核心原因 :直接字符串拼接 SQL,未做参数过滤
(1) 主流防护手段
① 使用预编译语句(最有效)
- JDBC:
PreparedStatement占位符? - MyBatis:#{} 预编译,自动转义
- 禁止
${}直接拼接字符串
② 严格区分 #{} 和 ${}
#{}:预编译、参数绑定、防注入,日常优先用${}:纯字符串拼接,极易注入,仅用于动态表名 / 排序字段
注:
- 为什么 #{} 能防注入?
底层采用预编译机制,参数单独绑定,不会把参数当成 SQL 语句执行。
- 必须用 ${} 时怎么防注入?
后端做白名单校验,限定只能传入指定合法值,拒绝任意自定义参数。
③ 入参统一过滤校验
- 非法字符拦截:
and/or/union/select/drop/--等关键字 - 正则限定格式:手机号、账号、数字类型强匹配
- 长度限制,拒绝超长恶意参数
④ 数据库层面防护
- 业务账号最小权限,不给 drop、alter 等高权限
- 关闭不必要存储过程
- 禁止外网直连数据库
⑤ 后端逻辑层管控
- 禁止前端直接传表名、字段名、排序字段
- 排序、分页字段后端枚举固定,不接收前端原生参数
- 分页、查询条件强制后端组装
5. XSS、CSRF 防护
(1) XSS 跨站脚本攻击
原理: 注入恶意 JS 代码 ,用户访问页面自动执行,窃取 Cookie、账号、跳转钓鱼网站。
防护方案:
- 前端转义: 输入框特殊字符转义,
< > & " '替换过滤 - 后端统一过滤: 接收参数过滤脚本标签、
script、iframe等 - **输出编码:**页面渲染数据时 HTML 实体编码
- **设置 Cookie HttpOnly:**禁止 JS 读取 Cookie,杜绝会话窃取
- **CSP 内容安全策略:**限制页面仅加载指定域名资源
(2) CSRF 跨站请求伪造
**原理:**利用用户已登录 Cookie,诱导用户在第三方网站悄悄发起请求,冒充用户操作。
防护方案:
- **核心:请求令牌 Token。**后端生成随机令牌存入 Session,表单 / 请求头携带,后端比对校验
- **校验请求来源:**校验 Referer、Origin 域名,拒绝陌生站点请求
- **添加验证码 / 短信验证:**高危操作(改密码、支付、解绑)强制验证
- **双重 Cookie 校验:**Cookie 放随机值,请求头再携带一份比对
- **接口使用 POST + 状态校验:**重要接口禁止 GET 请求
二、数据传输与存储安全
1. HTTPS加密传输
前后端接口、外网接口统一使用 HTTPS 加密传输。
- HTTP 是明文传输,端口 80,速度快但不安全,容易被抓包篡改;
- HTTPS 在 HTTP 基础上加了 SSL 加密,端口 443,需要安全证书,全程密文通信。
(1) HTTPS 加密过程
客户端与服务端协商秘钥,之后所有数据对称加密传输。
(2) 常见 HTTP/HTTPS 状态码
- 2xx 成功
- 3xx 重定向
- 4xx 客户端错误(前端 / 请求问题)
- 5xx 服务端错误(后端服务器问题)
(3) 常见问题
- 401 和 403 区别:401 没登录;403 已登录没权限
- 502 一般是:后端服务没启动、端口不通、服务挂了
2. 加密存储
用户密码加密存储,严禁明文保存。
(1) 不可逆加密(只存不解密)
用途:用户密码、登录密钥
常用算法:BCrypt、SHA-256 校验
特点:
- 明文加密后无法还原
- 登录时:明文加密 → 和库中密文比对
- 安全极高,不怕数据泄露
严禁使用:单纯 MD5(容易彩虹表破解)
(2) 可逆对称加密(需要解密使用)
用途:身份证、银行卡、手机号、地址 常用算法:AES特点:
- 加密存入数据库,业务使用时解密取出
- 加解密共用同一密钥
- 密钥必须单独保管,不能放代码
注:
**为什么密码不用 AES?**密码不需要解密,不可逆更安全,就算库被盗也无法破解原始密码。
对称加密密钥放哪里? 放配置中心、环境变量,绝不硬编码写死在代码里。