Laravel通过参数化查询防止SQL注入,查询构造器和Eloquent ORM自动绑定参数,避免用户输入被解析为SQL代码;使用whereRaw等方法时需手动绑定参数,并对表名、字段名采用白名单验证,确保安全。

Laravel 通过查询构造器(Query Builder)和 Eloquent ORM 提供了内置的安全机制来有效防止 SQL 注入攻击。核心原理是使用参数化查询(预处理语句),确保用户输入不会被当作 SQL 代码执行。
1. 查询构造器自动使用参数化查询
Laravel 的查询构造器在底层使用 PDO 预处理语句,所有动态数据都会作为参数绑定,而不是直接拼接进 SQL 字符串。
例如:
DB::table('users')->where('id', $userInput)->get();
即使 $userInput 是恶意字符串如 1 OR 1=1,Laravel 也会将其作为值处理,生成类似:
SELECT * FROM users WHERE id = ?
然后将用户输入作为参数传入,避免 SQL 解析错误或注入风险。
2. 使用 whereRaw 需要手动绑定参数
当使用 whereRaw、selectRaw 或 raw 方法时,如果包含用户输入,必须手动绑定参数以确保安全。
不安全写法(禁止):
DB::table('users')->whereRaw("name = '{$name}'");
安全写法(推荐):
DB::table('users')->whereRaw('name = ?', [$name]);
或使用数组绑定命名参数:
DB::table('users')->whereRaw('name = :name', ['name' => $name]);
3. 避免直接拼接用户输入到 SQL 片段
不要将用户输入直接用于表名、字段名或排序字段,这些无法通过参数化防护。
错误示例:
DB::table($tableName)->orderBy($sortField);
应使用白名单机制验证输入:
$allowedTables = ['users', 'posts']; $allowedFields = ['name', 'email', 'created_at'];if (! in_array($tableName, $allowedTables)) { abort(403); }
4. Eloquent 模型天然免疫常见注入
使用 Eloquent 操作数据库时,如 find、where、update 等方法,全部基于查询构造器,自动启用参数化查询。
例如:
User::where('email', $email)->first();
无需额外处理,安全由框架保障。
基本上就这些。只要遵循 Laravel 推荐的查询方式,避免裸写 SQL 拼接,就能有效防止 SQL 注入。关键点是:能用 Query Builder 就不用 raw,要用 raw 就必须绑定参数。










