阐述软件开发中的安全风险与防范机制
每条包含:定义 + 案例 + 危害 + 防范机制,OWASP Top漏洞
1、越权访问(分为横向越权、纵向越权)
定义:系统鉴权逻辑存在缺陷,用户在自身权限之外访问或操作不属于自己的资源/功能,分为水平(横向)越权、垂直(纵向)越权。
横向越权(水平越权)
定义 :用户角色、权限级别不变,非法访问同权限等级其他用户的数据 ,缺少数据归属校验。
案例 :电商订单查询接口 /api/order?orderId=10086。用户A查看自己订单10086,抓包修改orderId为其他用户的10087。后端仅校验登录状态,没有校验订单归属人,直接返回B用户的订单、手机号、收货地址。
危害 :批量窃取其他用户隐私数据。
防范 :SQL强制增加归属人条件 ;登录用户ID从Token获取,不接收前端传入;后端鉴权,前端隐藏按钮无效。
纵向越权(垂直越权)
定义 :低权限用户,非法调用高权限角色才允许使用的功能接口 ,缺少角色权限校验。
案例 :管理员删除用户接口 /api/admin/deleteUser?userId=5。普通用户页面没有该操作按钮,抓包直接调用该接口;后端只校验登录,未校验是否管理员角色,普通用户成功删除其他账号。
危害 :普通用户执行管理员高危操作,破坏系统数据。
防范 :RBAC权限模型(RBAC = Role‑Based Access Control,基于角色的访问控制:核心思想:不给用户直接分配权限,把权限绑定到角色,再给用户分配角色),接口增加角色权限注解(基于 AOP 实现);管理接口做后端强制鉴权。
2、SQL注入
定义 :攻击者将恶意SQL片段插入用户输入参数 ,后端直接把输入拼接到SQL语句执行,篡改原有SQL逻辑。
案例:登录接口直接拼接输入:
sql
select * from user where username = '${username}' and password='${pwd}'
攻击者用户名输入:' or '1'='1' -- ,拼接后注释掉密码条件,直接绕过登录无需密码进入系统。
危害 :绕过登录、查询篡改数据库、拖库。
防范 :使用预编译参数化查询 ,MyBatis用#{}(给字符串中单引号做转义处理,并且整体值加引号 ,适用于普通条件参数值),避免${}拼接用户输入(字符串不做转义直接拼进sql,不自动加引号,只适用于动态表名、列名、order by 排序字段,但仍需要对值做白名单校验);数据库账号最小权限;输入过滤校验。
普通条件参数举例 :攻击者输入用户名:' or '1'='1' -- ,密码:123
(1)使用 #
sql
-- mybatis sql 语句
select * from user where username = #{username} and password=#{pwd}
-- 最终sql
select * from user where username = '\' or \'1\'=\'1\' -- ' and password='123'
(2)使用 $
sql
-- mybatis sql 语句
select * from user where username = '${username}' and password='${pwd}'
-- 最终sql
select * from user where username = '' or '1'='1' -- ' and password='123'
order by 排序字段举例 :
sortColumn 传入id; delete from user; --,如果不校验 sortColumn ,将导致 user 表被删。
sql
-- mybatis sql 语句
select id,name from user order by ${sortColumn}
-- 最终sql
select id,name from user order by id; delete from user; --
3、XSS 跨站脚本攻击
定义 :攻击者注入恶意JS脚本,服务器将恶意代码输出到网页,浏览器执行恶意脚本,分为存储型、反射型、DOM‑XSS。
案例-存储型XSS :评论区提交评论 <script>alert(document.cookie)</script>,后端未过滤存入数据库。其他用户访问页面时,脚本在浏览器执行,窃取用户Cookie。
案例-反射型XSS :搜索接口/search?keyword=xxx,页面直接渲染url传入的keyword;构造恶意链接,用户点开页面直接执行恶意JS。
危害 :盗取会话Cookie、冒充用户身份、钓鱼欺骗。
防范 :输出时转义特殊字符;Cookie设置HttpOnly;配置CSP策略;富文本使用安全过滤库。
4、CSRF 跨站请求伪造
定义 :诱导已经登录目标网站的用户访问恶意页面,利用浏览器自动携带Cookie的特性,伪造用户身份发起非自愿请求 。
案例 :修改密码接口仅依靠Cookie识别身份。用户登录业务网站后访问恶意网页,网页自动发起请求/api/updatePwd?newPwd=123456;浏览器自动带上业务网站Cookie,后端误认为是本人操作,直接修改账号密码。
危害 :篡改密码、转账、修改个人信息,用户无感知被操作。
防范:关键接口增加CSRF‑Token;校验请求Origin/Referer;高危业务增加验证码二次确认。
5、文件上传漏洞
定义 :文件上传模块校验不严格,攻击者上传可执行脚本文件,服务器解析执行脚本,获取服务器权限。
案例 :头像上传功能,仅前端校验图片后缀。攻击者上传文件命名为mal.jsp.jpg绕过前端;后端只判断后缀,没有校验文件真实内容;上传成功后直接访问文件地址,服务器执行jsp木马脚本。
危害 :上传Web木马,控制服务器,窃取服务器文件。
防范:校验文件真实文件头,不只校验后缀;文件使用UUID重命名;上传目录禁止脚本执行权限;文件存独立静态服务器。
6、命令注入
定义 :后端直接拼接用户输入作为操作系统命令执行,攻击者注入分隔符追加额外系统命令 。
案例 :后台ping工具,输入IP执行ping命令。攻击者输入:127.0.0.1; cat /etc/passwd;分号分隔多条命令,执行ping后继续读取服务器账号文件。
危害 :执行任意系统命令,读取、篡改服务器本地文件。
防范:禁止拼接用户输入到系统shell命令;优先使用工具库代替Runtime.exec;使用输入白名单。
7、敏感信息泄露
定义 :系统在存储、接口返回、日志、异常堆栈中,直接输出密码、手机号、身份证等敏感数据,造成隐私泄露。
案例1 :用户查询接口直接返回明文身份证、手机号;日志打印密码、Token;生产环境把完整异常堆栈抛给前端,泄露数据库表名、服务器路径。
案例2 :用户密码明文存储数据库,一旦数据库泄露全部账号密码外泄。
危害 :用户隐私泄露,账号安全风险。
防范:密码使用BCrypt等哈希加盐存储;接口敏感字段脱敏;日志屏蔽密码、token;生产关闭详细异常堆栈输出;传输使用HTTPS。
8、身份认证与会话管理风险
定义 :登录认证、会话Token设计不合理,存在会话劫持、会话固定、Token长期不失效等问题,造成账号被盗。
案例 :登录Token设置永久有效期,攻击者拿到Token可以永久登录账号;会话固定:攻击者预先设置一个sessionId,诱导用户登录,登录后sessionId不变,攻击者直接复用该sessionId登录受害者账号。
危害 :会话劫持,账号被盗。
防范:Token设置合理过期时间;登出销毁Token;登录成功刷新会话ID;高危操作增加验证码。
9、SSRF 服务端请求伪造
定义 :业务存在服务端发起网络请求的功能,攻击者传入自定义URL,由服务器代替攻击者发起请求 ,探测、攻击内网资源。攻击者本身无法访问内网,借助服务器作为跳板。
案例 :图片抓取接口,接收用户传入url由后端下载图片;攻击者传入内网地址http://127.0.0.1:3306,服务器访问本地及内网服务,扫描内网端口,读取内部接口数据。
危害 :内网探测、访问内部服务,造成内网数据泄露。
防范:拦截回环地址、内网网段;设置访问白名单;关闭重定向跟随;设置请求超时。
10、重放攻击
定义 :攻击者抓包获取合法业务请求 ,在不修改报文内容的情况下,反复重复提交该请求 ,破坏业务逻辑。
案例 :支付下单接口没有防重放机制,抓包拿到完整支付请求报文,反复提交数据包,造成同一订单多次扣款、重复下单。
危害 :重复下单、重复扣款,业务逻辑错乱。
防范 :请求携带timestamp时间戳 + nonce随机串,校验时间窗口;业务接口实现幂等;数据库增加唯一索引。
11、CORS跨域配置不当
定义 :后端跨域资源共享CORS配置错误,允许不受信任的外部域名跨域访问并携带Cookie,导致第三方网站窃取业务数据。
案例 :后端配置Access‑Control‑Allow‑Origin: *,同时开启允许携带Cookie;恶意网站发起跨域AJAX请求,浏览器自动带上用户Cookie,后端返回业务数据被恶意网站窃取。
危害 :跨域窃取用户业务数据。
防范 :配置具体可信域名,禁止直接使用通配符*;Cookie配合SameSite属性。
通用安全开发原则
- 永远不信任前端传来的任何输入,所有校验、鉴权必须在后端实现;
- 最小权限原则:数据库账号、接口权限、文件权限尽量收敛;
- 敏感数据加密存储,传输全部使用HTTPS;
- 业务接口做好幂等,防止重复提交;
- 错误提示只返回业务提示,不要把内部堆栈、路径、表名对外暴露。