后台的删除和状态切换接口,能不能用浏览器直接访问触发
后台里删除一条数据、切换一个状态的接口,如果允许浏览器直接用地址访问就触发,风险不在于「接口暴露」这层字面意思,而在于任何带着登录态的点击都可能变成一次执行。同行开源程序的一次版本修复正是这条:后台用户删除与状态切换接口可被裸 GET 请求触发跨站请求伪造,修复方式是改为 POST 提交并校验表单标识。这类修复值得每个建站的人对照自查一遍。
什么样的接口会被浏览器直接触发
满足两个条件的接口就在这一类里:一是它靠地址栏就能访问,也就是没有区分请求方法;二是它会改数据,删除、启用停用、审核通过、移入回收站都算。
危险组合出现在这里:管理员登录后没有退出,登录态还在浏览器里;这时他打开了别人发来的一篇文章、一个图片地址或者一段嵌在页面里的自动请求。请求带着他的身份到达后台,服务器看到的是「已登录的管理员在执行删除」,看不出这一下不是他主动点的。
为什么登录态本身就够危险
后台的认证通常靠会话凭证:登录成功后发一个凭证,之后的请求都带着它。用 JWT 这类签名令牌的实现里,凭证本身不需要再查一次密码,只要签名对得上就被认。这带来一个特性——凭证是否被借用,从认证这一步看不出来。
所以真正的防线不能只放在「有没有登录」,要放在「这一次动作是不是用户在本页面上主动发起的」。
请求方法和一次性校验各挡什么
两件事解决的是两个问题:
| 收口手段 | 挡住的场景 | 挡不住的场景 | 判断依据 |
|---|---|---|---|
| 改状态的动作只接受提交方法,不接受直接访问 | 页面里塞进来的自动请求、图片占位式请求 | 攻击者诱导用户主动提交表单 | 接口是否区分方法 |
| 校验一次性的表单标识 | 跨站发起的写操作 | 已拿到页面内容的高级构造 | 校验值是否与会话绑定、是否只可用一次 |
| 凭证设较短有效期 | 登录态被长期借用 | 有效期内的一次性滥用 | 过期时间与刷新策略 |
| 高危接口按域关闭 | 不需要的能力被外部调用 | 已开启能力的误用 | 默认是否开放 |
单独用第一条会被绕过,单独用第二条也一样;两条同时用才让「改数据」这件事必须带一个攻击者无法从自己页面里获得的值。
自家后台在这两处怎么收口
站内的安全能力是按层配置的:认证走签名令牌,接口层按意图目录收敛暴露范围,备份、升级、多站点这类全站级操作默认关闭,需要显式开启才对外可调用。写操作还支持回合级合并确认,一次批量动作要先给出会改什么的清单,确认后才落。
版本层面也有对照。v3.6.6 修掉的两条问题里,一条是列表排序参数被拼进查询语句造成的注入,另一条是站点切换用的登录凭证可以被伪造。前者属于「参数进了查询」,后者属于「凭证的有效期与用途设得太宽」。这两条和跨站请求伪造其实是同一类问题的三个面:能被借用的东西,都不要留给外部去猜。
自查三步:列表、方法、校验
第一步,把后台所有会改数据的动作拉一份清单,按「删除类、状态类、导入类」分三组。第二步,逐个确认这些动作能不能用直接访问触发;能触发的全都要改。第三步,确认每个动作是否带与会话绑定的校验值,以及这个值是否用过即废。
补一条运维口径:修完之后要轮换签名密钥并修改管理员密码,因为攻击面收口解决的是以后,凭证是否已经泄露解决的是现在。
常见问题
问:只把后台地址改成猜不到的路径行不行? 答:不够。地址混淆不改变「请求带登录态就会被执行」这件事,而且把后台路径写进 robots 之类的公开文件反而暴露入口。
问:接口只做查询会不会有风险? 答:风险性质不同。查询接口要防的是越权读取和注入,改数据要防的是被借用发起,两类要分别校验。
问:限流和验证码能替代这两条吗? 答:不能。它们降低批量尝试的效率,但一次成功的伪造不需要多次尝试。