二七王:补齐客户端牌id入参校验(重复/越界/非数组)
check_cards_inhand 此前只逐个校验牌id是否在手上,不查重复、不查 类型与范围,且在牌已出/已埋时 return 空值而非 false,造成两个可 被利用的缺陷: 1. 重复牌id 可伪造牌型:do_playcard([方块K,方块K]) 实测返回 result=true、cardtype=201(同一张牌被判成一对),可进而伪造 拖拉机与甩牌分量,本轮结算时该分牌的 score 还会被重复累加。 2. 埋牌传 8 个相同 id 实测只埋下 1 张,庄家带 35 张进入出牌阶段, 整局牌数错乱。 3. 越界 id 或非数组入参会在解引用处抛异常,中断 DoPack。 新增 check_cards_valid 作为唯一入参校验入口(非空数组、元素为本 局牌表内的整数牌id、互不重复),由 check_cards_inhand 先行调用; mod.maipai/mod.chupai 在读取 cards.length 之前先过该校验。按 engineering §03「显式失败优于隐式兜底」直接拒绝,不做类型兜底。 新增 test_input.js 28 项正/反/边界用例回归上述三点。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -230,6 +230,10 @@ youle_erqiwang.maipai = function(pack){
|
||||
if (o_paiju.banker != seat){
|
||||
return;
|
||||
}
|
||||
//检查埋牌入参本身是否合法(数组/整数牌id/范围/无重复),须先于 length 判断
|
||||
if (!o_paiju.method.check_cards_valid(cards)){
|
||||
return;
|
||||
}
|
||||
//检查埋牌是否是8张
|
||||
if (cards.length != 8){
|
||||
return;
|
||||
@@ -355,8 +359,8 @@ youle_erqiwang.chupai = function(pack){
|
||||
if (seat != o_paiju.playproc.currseat){
|
||||
return;
|
||||
}
|
||||
//检查出牌
|
||||
if (cards.length == 0){
|
||||
//检查出牌入参本身是否合法(数组/整数牌id/范围/无重复,含非空)
|
||||
if (!o_paiju.method.check_cards_valid(cards)){
|
||||
return;
|
||||
}
|
||||
//检查出牌是否都在玩家手上
|
||||
|
||||
Reference in New Issue
Block a user