You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Livewire组件中安全使用like或=筛选器?

解决方案

1. 修改前端下拉框,使用安全别名

把直接暴露的like/=替换成无歧义的业务别名,避免前端直接传递SQL操作符:

<select wire:model="condition" class="form-control">
    <option value="contains">模糊匹配</option>
    <option value="exact">精确匹配</option>
</select>

2. 后端做条件映射与安全校验

通过白名单映射前端别名到真实SQL操作符,同时补全like查询必需的通配符(这是你之前like功能失效的核心原因):

public function render()
{
    // 定义允许的查询规则白名单,前端传别名,后端对应真实操作
    $conditionMap = [
        'contains' => 'like',
        'exact' => '=',
    ];

    // 校验前端参数,非法值默认用精确匹配
    $validCondition = $conditionMap[$this->condition] ?? '=';

    $query = BC::query();

    // 根据校验后的条件执行查询
    if ($validCondition === 'like') {
        // 模糊匹配需用%包裹搜索字符串
        $query->where($this->option, $validCondition, "%{$this->searchString}%");
    } else {
        $query->where($this->option, $validCondition, $this->searchString);
    }

    return view('livewire.customer', [
        'bCs' => $query->get(),
    ]);
}

关键说明

  • 防篡改:前端传递的是业务别名而非SQL操作符,即便前端被篡改传递非法值,后端会默认使用精确匹配,不会执行危险操作。
  • 修复like失效:like查询必须搭配%通配符才能实现模糊匹配,之前的代码缺少这一步导致功能失效。
  • 安全加固:建议同时对$this->option做字段白名单校验,确保只能查询数据库中存在的字段,进一步规避SQL注入风险。

内容的提问来源于stack exchange,提问作者Nazari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:32:48