如何将Model作为变量代入代码替代switch结构避免编写重复查询逻辑
解决方案
完全可以合并,PHP原生支持将类名字符串作为变量调用静态方法,你只需要先做一次合法模型白名单校验即可,避免用户传入恶意类名引发安全问题。
优化后的代码如下:
// 先定义允许的模型白名单 $allowModels = [ Review::class, Question::class, Answer::class ]; // 校验传入的类型是否合法 if (!in_array($data['model_type'], $allowModels)) { return $this->jsonError('404', 404); } // 直接用类名变量调用查询方法 $modelClass = $data['model_type']; $record = $modelClass::query() ->where('id', $data['model_id']) ->whereNotNull('published_at') ->first();
注意事项
- 必须加白名单校验,不要直接使用用户传入的未校验参数作为类名,防止攻击者传入意料之外的类触发代码执行风险
- 如果你用的是Laravel框架的多态关联,也可以直接用
getMorphClass相关方法做映射校验,逻辑本质和上面的白名单方案一致
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

