介绍
Gearroom 的市场服务点提供主登录页面和移动登录页面,两者都会打开同一位会员的借用记录。策略已经按账户计数,但两个页面保留独立计数器。在一个页面受到限制的会员,仍可在另一个页面完成认证。
用限定数量的 Hydra 尝试展示该缺口,再让两个入口共享同一账户限制。验证两个方向,保留另一位会员的正常登录,并确认冷却自然结束后的恢复。你要交付的是真实生效的策略、真实请求历史和未改变的记录,不是报告。
本引导实验建立在 Limit Attempts by Account 的基础上:你应当认识其中的 Hydra 表单参数、已知成功标记、JSON 策略、curl 诊断和 deskctl 命令。这些机制保持不变。本环境重新初始化,使用不同的会员与记录;不会继承先前的文件、会话或进程。Workstation 是准备好的终端,Equipment Desk 是网站。两者属于同一个隔离训练容器。所有账户与数据均为本地合成资源。
预留约 50 分钟,包含阅读与普通错误处理;这是作者估计,并非初学者实测时间。只有声明的测试会员可以接受重复错误密码。参考会员必须使用已知正确密码。保持原始服务、账户、记录和训练数值不变。
确认同一账户有两个入口
在这一步,确认两个页面确实认证同一位会员,并打开同一份借用记录。相似的标签本身不能证明身份相同。
打开 Equipment Desk,再选择 Review brief。允许测试的会员是 samplemember,密码 Sample24。正常参考会员是 deskteam,密码 Desk24。
选择 Member sign-in,提交测试会员的凭据,再选择 Open your record。检查 samplemember、借用记录 LN-318、Jules Chen、Workshop camera kit、领取时间 Friday 09:30、归还时间 Monday 16:00,以及将两块电池放入有标签袋子的说明。选择 Sign out。

每次真实登录后,都比较 Member 和 Record 字段、两个时间以及装箱说明。两个页面应打开这同一份记录。
选择 Mobile sign-in,使用相同测试凭据并打开记录。核对同一身份、借用编号和完整信息,然后退出登录。这是同一个会员目录的两个入口,不是两个不同账户或主机。
选择 Member sign-in,使用 deskteam / Desk24,再打开其记录。应为 LN-087、Ari Lane、Folding projection screen,并附有装箱前保持幕布干燥的说明。再次退出登录。
切换到 Workstation。该入口从 /home/labex/project/login-limits 开始;pwd 显示位置:
pwd
如果位于其他位置,使用前面相同的切换目录命令:
cd /home/labex/project/login-limits
阅读准备好的策略与实际生效策略:
cat policy.json
deskctl status
key 已经是 account。在 entry_groups 中,/signin 属于 desktop,/mobile/signin 属于 mobile。组标识该账户的哪些入口共享计数器。当前不同组标签让同一会员拥有两个独立计数器。保持三次失败、30 秒窗口和 12 秒冷却的数值不变。
观察备用入口的缺口
在这一步,让主入口受到限制,并展示同一冷却期间通过移动入口发生的真实登录。
留在 Workstation。准备好的文件仍然只包含允许测试会员的五个故意错误候选:
cat wrong-passwords.txt
两个可见表单下方列出了实际 POST 路径。它们都使用 username 和 password 字段。回环地址 127.0.0.1 与端口 8080 指向该本地训练服务。Hydra 的 -l 现在选择 samplemember;-P、-s、-t 1、-I、带引号的 POST 参数和 S=Signed in as 与第一个引导实验中的含义相同。所有候选都错误,因此完整运行应报告 0 valid password found;仅凭该输出不能证明备用入口受到保护。
让先前尝试自然过期:
deskctl wait
将下列四个命令一起运行,中间不要停下阅读。curl 探针使用已知正确密码;-o 保存各响应正文,-w 输出其 HTTP 状态:
hydra -I -l samplemember -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o main-probe.html -w 'Main HTTP %{http_code}\n' --data 'username=samplemember&password=Sample24' http://127.0.0.1:8080/signin
curl -s -o mobile-probe.html -w 'Mobile HTTP %{http_code}\n' --data 'username=samplemember&password=Sample24' http://127.0.0.1:8080/mobile/signin
curl -s -o reference-probe.html -w 'Reference HTTP %{http_code}\n' --data 'username=deskteam&password=Desk24' http://127.0.0.1:8080/mobile/signin
应看到 Main HTTP 429、Mobile HTTP 200 和 Reference HTTP 200。同一测试会员在主入口受到限制,却能在移动入口认证。确认移动入口的身份,不要仅相信 200:
grep -o 'Signed in as samplemember' mobile-probe.html
阅读真实服务器决策:
deskctl events
寻找同一版本下 samplemember 在 /signin 上达到阈值、主入口登录受到限制,以及在 /mobile/signin 上认证成功的事件。单一入口的受限事件不能证明跨入口限制。参考会员仍是独立账户;参考账户成功并不能修复此缺口。
冷却结束后,历史仍然可读。如果错过观察窗口,让 deskctl wait 完成后,重复同一个限定命令块。出现连接或 Hydra 语法错误时,先修正完整参数、地址、端口和声明路径。HTTP 400 表示提交的字段名或结构有误;404 表示路径错误。普通拼写错误不需要重置 VM。
将两个页面归入同一账户组
在这一步,让两个 POST 路径对同一会员使用一个计数器。不同账户之间仍必须相互独立。
留在 Workstation。用下面的完整对象替换策略文件。带引号的 here-document 保持 JSON 为字面内容;结束标记 EOF 必须独占一行,前面没有空格。与前面一样,> 会覆盖这个本地文件:
cat > policy.json <<'EOF'
{
"key": "account",
"entry_groups": {
"/signin": "members",
"/mobile/signin": "members"
},
"failed_attempts": 3,
"window_seconds": 30,
"cooldown_seconds": 12
}
EOF
两个路由现在使用相同组标签。标签只是简短的非空名称,不是特殊关键字;也允许其他等效共享名称。标签最多可有 48 个字符。保留账户键、两个真实路由键与约定数值。删除路由、禁用表单或改回全局计数器都不符合任务要求。
明确应用文件:
deskctl apply policy.json --wait
策略有变化时,要等待现有尝试状态自然过期。不会清除活跃计数器、历史或会员记录,也不会重启进程。重复应用同一策略仍然不产生变化。缺少 JSON 逗号或字段错误会使旧策略继续生效;重试前先修正文件。
deskctl status
确认新版本下的运行策略使用 account 键和相同组标签。本地文件写对还不够,服务必须实际使用它。接下来需要当前版本的证据,而不能复用先前入口分组时的事件。
测试两个方向并保留会员访问
在这一步,证明任一页面上的失败都会限制另一页面,同时参考会员仍可工作,测试会员也能够自然恢复。
留在 Workstation。先测试主入口到移动入口:
deskctl wait
将这个完整命令块一起运行:
hydra -I -l samplemember -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o mobile-probe.html -w 'Mobile HTTP %{http_code}\n' --data 'username=samplemember&password=Sample24' http://127.0.0.1:8080/mobile/signin
curl -s -o reference-probe.html -w 'Reference HTTP %{http_code}\n' --data 'username=deskteam&password=Desk24' http://127.0.0.1:8080/mobile/signin
应看到 Hydra 零条发现、Mobile HTTP 429 和 Reference HTTP 200。两份保存的正文应与之对应:
grep -o 'Too many attempts' mobile-probe.html
grep -o 'Signed in as deskteam' reference-probe.html
deskctl events
当前版本必须显示主入口达到阈值、移动入口拒绝,以及参考账户正常认证。等待自然恢复:
deskctl wait
切换到 Equipment Desk,选择 Mobile sign-in,使用 samplemember / Sample24 并选择 Open your record。检查未改变的 LN-318 相机记录与电池袋说明,再选择 Sign out。这次新的移动登录确认已经从主入口造成的限制中恢复。
返回 Workstation。现在反向测试:
deskctl wait
将这个完整命令块一起运行:
hydra -I -l samplemember -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/mobile/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o main-probe.html -w 'Main HTTP %{http_code}\n' --data 'username=samplemember&password=Sample24' http://127.0.0.1:8080/signin
curl -s -o reference-probe.html -w 'Reference HTTP %{http_code}\n' --data 'username=deskteam&password=Desk24' http://127.0.0.1:8080/signin
应看到零条发现、Main HTTP 429 和 Reference HTTP 200:
grep -o 'Too many attempts' main-probe.html
grep -o 'Signed in as deskteam' reference-probe.html
deskctl events
这次应在移动入口达到阈值后,出现主入口拒绝。它是另一个方向,不能把第一次结果换个名字当作第二次。如果诊断命令执行得太晚,应自然等待状态稳定,再重复该限定方向;不要扩大候选集合或重置计数器。
deskctl wait
切换到 Equipment Desk,选择 Member sign-in,使用 samplemember / Sample24,再打开原始 LN-318 记录。此次主入口登录展示了从移动入口限制中恢复。退出登录,再用 Member sign-in 和 deskteam / Desk24 打开 LN-087,检查幕布和装箱前保持干燥的说明。再次退出登录,然后打开 Visitor guide。
每次真实登录后,浏览器建立自己的会话;curl 诊断响应不会使浏览器登录。如果记录返回 403,修正实际浏览器登录,再选择 Open your record。修正普通密码或路径错误时,不要重启场景。
两个真实入口现在为每个账户遵循同一限制。当前策略下的证据覆盖两个方向,参考访问保持正常,测试账户自然恢复,业务记录也没有改变。评分只读取已有事实与公开页面,不会代为完成缺失测试或恢复。这证明的是声明的本地单进程行为,不是分布式生产限制,也不是对所有自动登录方式的完整防御。
总结
你确认了两个真实登录页面共享同一身份,复现了独立入口组造成的缺口,并应用共享的账户计数器。随后,限定范围的 Hydra 测试展示了两个方向的限制、正常参考访问,以及自然恢复后未改变的记录。单个页面的拒绝或旧策略的历史,都不能证明完整结果。



