防御对象
- 跳过前置流程,直接执行后置步骤的请求。
- 核心接口CSRF防御。
防御方案
cookie
12306利用 tk 这个cookie,来管理当前会话所处的上下文状态,即当前会话所处流程节点。
-
登录节点 用户登录接口
https://kyfw.12306.cn/otn/uamauthclient
成功后,会写入 tk cookie,该次写入的cookie指示会话登录之后到下单之前的上下文信息。 -
下单节点 用户下单接口
https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest
成功后,同样会写入 tk cookie,该cookie标示当前会话已进入并且处于下单流程,任何不带该正确标示或者不处于下单流程均会由后端反馈异常。 -
确认订单 用户确认订单接口
https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo 以及 https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount
, 成功会写入cookie,标志进入确认订单流程,不正确的标示或者不正确的流程均会导致后端 tk cookie校验失败报错。 -
12306同样在部分场景可能对tk做扩展其作用域操作,至于何时扩展其作用域,何时重新写入新作用域的cookie,我暂时还并未发现判断依据。
REPEAT_SUBMIT_TOKEN
12306服务端在渲染页面时会将后端生成的一个token,所有的订单提交请求均需将该token一并提交到后端进行验证。
我认为该token更像是一种对csrf攻击的防御,即防止其他用户伪造链接,骗取用户点击,达到盗取cookie,伪造请求的目的。
该token并非像该变量名所标示的那样,拥有防止重复提交的目的。