WeChall - Tracks
Challenge
一个投票系统,需要投至少 2 次票。没有 IP 检查,但使用 HTTP 缓存机制(ETag/VOTE cookie)防止重复投票。
Solution
投票页面 votes.php 用 HTTP
缓存头做投票去重——这不是缓存的典型用法,但原理相同:
- VOTE cookie: 服务器设置
VOTE=<value>cookie 标记已投票 - ETag / If-None-Match: 服务器返回
ETag头,浏览器后续请求带If-None-Match验证资源未变
两层缺一不可: 没有 cookie 服务器不知道你投过票;没有 If-None-Match 服务器认为是新的投票请求。
第一次投票成功后,服务器返回 "Please press the vote button again"。关键在于第二次请求必须同时带上第一次响应的 VOTE cookie 和 ETag 值。
ETag 值带 W/ 前缀表示 weak
validator(语义等价即可,不要求字节一致),但 curl 传 If-None-Match
时要带这个前缀。
1 | # 第一次投票 - 捕获 ETag 和 VOTE cookie |