MIC

加载中 0%

MICMIC

网站开发中常见的安全漏洞有哪些?MIC Studio 实战梳理

·

网站开发里最容易被忽略的安全漏洞,往往不是黑客太强,而是基础没做好。本文从注入、权限、文件上传、接口越权和依赖组件五个方向,讲清常见漏洞的成因、复现思路和修复建议,并说明企业网站、小程序开发、App开发中什么阶段适合找 MIC Studio 做安全测试与逆向测试。

很多老板第一次认真看待安全,是在网站被挂马、后台被人登录、用户数据被打包下载之后。这时候再去查日志、补漏洞,成本往往比一开始做好防护高得多。


说实话,网站开发中常见的安全漏洞,绝大多数都不是什么高深技术,而是基础工作没做到位。下面按实战中最常踩的坑,一个个说清楚。


一、注入类漏洞:SQL 注入和命令注入


SQL 注入是最经典的漏洞。成因很简单:程序把用户输入直接拼进 SQL 语句。比如登录框里输入一段构造好的字符,就能绕过密码校验,甚至把整张用户表拖走。


常见做法与避坑:


- 用参数化查询或 ORM,不要手写字符串拼接

- 数据库账号按最小权限分配,只读业务就别给写权限

- 关闭生产环境的详细报错,报错信息本身就是情报

- 对输入做类型校验,比如 ID 只允许数字


命令注入同理。有些脚本开发场景需要调用系统命令处理图片、生成文件,如果把文件名直接拼进命令,攻击者就能顺带执行别的指令。这类问题在后台管理系统里尤其常见。


二、权限与越权:登录了不等于有权限


这是企业网站和后台系统里最容易被低估的一类。用户确实登录了,但访问了不该访问的数据。


分两种:


- 水平越权:普通用户 A 通过改 URL 里的订单号,看到了用户 B 的订单

- 垂直越权:普通用户直接访问管理员接口,比如删除用户、导出数据


一个具体场景:某预约类小程序开发项目,接口是 `/api/order/detail?id=1001`。前端只显示自己的订单,但后端没有校验这个订单属不属于当前用户。只要把 id 改成 1002,就能看到别人的手机号和地址。


做法:


- 每个涉及数据的接口,都要在服务端校验「当前用户是否有权访问这条数据」

- 不要依赖前端隐藏按钮来做权限控制

- 管理后台和用户端接口分开,鉴权逻辑独立


三、文件上传与文件包含


文件上传本身没问题,问题在于「上传之后能不能被执行」。


常见坑:


- 只校验前端后缀名,抓包改一下就能传 PHP、JSP

- 上传目录有执行权限,传个脚本直接拿到服务器

- 文件名可预测,攻击者能遍历下载


建议做法:


- 服务端校验文件类型,白名单而不是黑名单

- 上传目录禁止脚本执行,只允许静态访问

- 文件重命名,用随机串,不保留原始路径

- 图片类文件做二次处理,顺带去掉可能夹带的恶意内容


四、接口与业务逻辑漏洞


很多漏洞不在代码层面,而在业务流程里。比如:


- 短信验证码没有次数限制,可以被暴力枚举

- 支付回调没有验签,可以伪造「已支付」

- 优惠券可以并发领取,一人领一百张

- 密码找回流程可被绕过,直接重置他人密码


这类问题在 App开发 和小程序开发 里特别值得注意,因为接口暴露面比传统网站更广,很多人以为「App 里看不到接口就安全」,其实抓包工具一开,请求清清楚楚。


避坑建议:


- 关键接口加频率限制和风控

- 支付、退款等敏感操作必须服务端验签、二次确认

- 业务状态流转要在服务端判断,不能信前端传过来的状态


五、依赖组件与配置问题


不少企业网站出问题,不是自己写的代码有洞,而是用的开源框架、插件版本太旧。


- 第三方 CMS、建站系统长期不更新

- 中间件默认配置没改,比如后台弱口令、默认端口对外开放

- 云服务器安全组开得太大,数据库直接暴露公网

- 测试环境、备份文件、.git 目录被同步到线上


做法很朴素:定期更新依赖,上线前做一次配置检查,把不该对外开放的端口关掉,删掉线上多余的调试文件。


什么情况适合找 MIC Studio


如果你的项目属于下面几种情况,自己团队又没精力系统排查,找专业团队做一轮安全测试会更划算:


- 企业网站刚改版上线,涉及会员、表单、支付

- 小程序开发或 App开发 进入提测阶段,接口多、逻辑复杂

- 后台管理系统涉及多角色权限,越权风险高

- 需要做逆向测试,评估接口被批量调用、数据被抓取的风险

- 已经出过安全事件,需要定位原因并做加固


MIC Studio 的做法是先梳理资产和接口,再按注入、权限、上传、逻辑、配置几个方向做测试,输出可复现的问题清单和修复建议,而不是只给一份看不懂的扫描报告。


结尾:三条能马上做的事


1. 上线前做一次权限自查:把所有接口列出来,逐个问「不登录能不能访问」「换个用户 ID 能不能看到别人数据」。

2. 管好输入和输出:所有用户输入都校验,所有数据库操作都参数化,所有报错信息都不外泄。

3. 把安全当成持续动作:依赖定期更新,配置定期检查,重要版本上线前做一轮安全测试,别等出事再补。


安全不是一次性的项目,而是开发流程里的一部分。早一点想清楚,后面少很多麻烦。