news 2026/4/16 13:44:47

Laravel 所有查询(包括 Eloquent)最终都通过 PDO::prepare() + PDOStatement::execute() 执行。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Laravel 所有查询(包括 Eloquent)最终都通过 PDO::prepare() + PDOStatement::execute() 执行。

这句话在绝大多数情况下是正确的Laravel 中所有通过 Query Builder 或 Eloquent 发起的数据库查询,最终都会经由PDO::prepare()+PDOStatement::execute()执行。这是 Laravel 实现SQL 注入防护跨数据库兼容性的核心技术机制。

但为了严谨,我们需明确其适用范围、例外情况、底层细节,做到“知其然,更知其所以然”。


✅ 一、正常路径:几乎所有查询都走预处理

1.Eloquent 查询
User::where('email','john@example.com')->first();
  • 编译为 SQL:SELECT * FROM users WHERE email = ?
  • 绑定参数:['john@example.com']
  • 执行路径:
    $pdo=$connection->getPdo();$stmt=$pdo->prepare("SELECT * FROM users WHERE email = ?");$stmt->bindValue(1,'john@example.com',PDO::PARAM_STR);$stmt->execute();// ← 最终调用
2.Query Builder
DB::table('users')->insert(['name'=>'John']);
  • 同样生成带占位符的 SQL,通过PDOStatement::execute()执行。
3.原生查询(带绑定)
DB::select('SELECT * FROM users WHERE id = ?',[1]);
  • 显式使用绑定,必然走预处理。

🔒安全基石:因为参数通过bindValue()execute($bindings)传递,与 SQL 模板分离,数据库在解析阶段就区分“代码”与“数据”,彻底阻断 SQL 注入。


⚠️ 二、例外情况:绕过预处理的“危险操作”

虽然 Laravel默认且推荐使用预处理,但开发者主动选择时,可绕过它:

1.DB::statement()执行无绑定的原生 SQL
DB::statement("DELETE FROM users WHERE created_at < '2020-01-01'");
  • 若 SQL 中不含参数绑定,Laravel 会直接调用PDO::exec()(非prepare+execute)。
  • 但若传入用户输入且未绑定,极易导致注入!
2.DB::raw()+ 字符串拼接(反模式)
// ❌ 危险!绕过绑定,直接拼接$where="email = '".$userInput."'";User::whereRaw("{$where}")->get();
  • 此时 SQL 完全由字符串构成,Laravel 无法干预,直接传给prepare()但无参数绑定
  • 虽仍调用prepare(),但因无占位符,等效于不安全执行。

✅ 正确用法:

User::whereRaw('email = ?',[$userInput])->get();// 安全,走预处理
3.Schema 操作(Migration)
Schema::create('users',function(Blueprint$table){...});
  • DDL 语句(CREATE, ALTER)通常不支持参数绑定,故直接通过PDO::exec()执行。
  • 但因 DDL 一般不包含用户输入,风险较低。

🔬 三、底层验证:Laravel 源码如何执行?

Illuminate\Database\Connection中:

// 执行带绑定的查询(SELECT, INSERT, UPDATE...)protectedfunctionrunQueryCallback($query,$bindings,Closure$callback){try{$result=$callback($query,$bindings);}catch(PDOException$e){// 包装为 QueryExceptionthrownewQueryException($query,$bindings,$e);}return$result;}// 示例:select 方法内部publicfunctionselect($query,$bindings=[],$useReadPdo=true){return$this->run($query,$bindings,function($query,$bindings)use($useReadPdo){$pdo=$this->getPdoForSelect($useReadPdo);$statement=$pdo->prepare($query);// ← prepare$this->bindValues($statement,$bindings);// ← bind$statement->execute();// ← executereturn$statement->fetchAll(/* ... */);});}

✅ 可见:只要查询有$bindings,就必然走prepare+bind+execute


📌 四、重要补充:模拟预处理(Emulated Prepares)

PDO 有两种预处理模式:

模式行为Laravel 默认
Native Prepares(ATTR_EMULATE_PREPARES = false)SQL 与参数分别发送到数据库服务器,由 DB 引擎处理默认启用
Emulated Prepares(= true)PDO 在 PHP 层拼接 SQL,再发送完整语句❌ 禁用

Laravel 在连接器中显式关闭模拟预处理config/database.php中默认设置):

'options'=>extension_loaded('pdo_mysql')?array_filter([PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT=>false,PDO::ATTR_EMULATE_PREPARES=>false,// ← 关键!]):[],

✅ 这确保了真·预处理,即使在极端情况下(如二进制数据、特殊字符)也能安全执行。


✅ 结论

说法是否成立说明
“Laravel 所有查询都通过prepare()+execute()执行”基本成立只要使用了参数绑定(Laravel 默认行为),就一定走此路径
“包括 Eloquent”✅ 成立Eloquent 最终调用 Query Builder → Connection → PDO
“100% 无例外”❌ 不严谨DB::statement("raw sql")、DDL、错误使用DB::raw()可能绕过绑定,但仍可能调用prepare()(只是无参数)

🔑核心要义
Laravel 的安全默认行为是——所有含动态值的查询,都通过带参数绑定的预处理语句执行。
开发者只要不手动拼接 SQL,即可天然免疫 SQL 注入。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:44:02

Sophia Script实战指南:深度优化Windows字体渲染清晰度

Sophia Script实战指南&#xff1a;深度优化Windows字体渲染清晰度 【免费下载链接】Sophia-Script-for-Windows farag2/Sophia-Script-for-Windows: Sophia Script 是一款针对Windows系统的自动维护和优化脚本&#xff0c;提供了大量实用的功能来清理垃圾文件、修复系统设置、…

作者头像 李华
网站建设 2026/4/16 11:04:27

U-2-Net显著对象检测:从入门到精通的完整实战教程

想要掌握业界领先的显著对象检测技术&#xff1f;U-2-Net凭借其独特的嵌套U型结构&#xff0c;在图像分割领域表现出色。本教程将手把手带你从零开始&#xff0c;通过实战演练、原理剖析到优化进阶的三段式学习路径&#xff0c;让你快速掌握这一强大工具。 【免费下载链接】U-2…

作者头像 李华
网站建设 2026/4/16 9:25:09

rpatool 终极指南:简单快速掌握 Ren‘Py 档案处理技巧

rpatool 终极指南&#xff1a;简单快速掌握 RenPy 档案处理技巧 【免费下载链接】rpatool A tool to work with RenPy archives. 项目地址: https://gitcode.com/gh_mirrors/rp/rpatool rpatool 是一款专为处理 RenPy 游戏档案文件而设计的强大工具&#xff0c;支持 RPA…

作者头像 李华
网站建设 2026/4/16 11:14:02

Escrcpy终极指南:如何用电脑轻松控制Android设备

Escrcpy终极指南&#xff1a;如何用电脑轻松控制Android设备 【免费下载链接】escrcpy &#x1f4f1; Graphical Scrcpy to display and control Android, devices powered by Electron. | 使用图形化的 Scrcpy 显示和控制您的 Android 设备&#xff0c;由 Electron 驱动。 项…

作者头像 李华
网站建设 2026/4/16 9:24:18

5大关键参数深度解析:mBART-50多语言翻译模型性能调优实战指南

在当今全球化语言环境中&#xff0c;多语言机器翻译技术已成为AI开发者的必备技能。mBART-50 many to many multilingual machine translation模型作为一项先进的多语言翻译技术&#xff0c;支持50种语言间的直接互译&#xff0c;为开发者提供了强大的语言转换能力。本文将深入…

作者头像 李华
网站建设 2026/4/16 9:23:39

Brave浏览器:重新定义你的在线隐私保护体验

你是否厌倦了被广告跟踪工具无休止地跟踪&#xff1f;是否担心个人数据在不知情的情况下被收集&#xff1f;Brave浏览器正是为你量身打造的隐私保护解决方案&#xff0c;这款基于Chromium的开源浏览器通过创新的技术架构&#xff0c;为你构建了一个安全、快速、无干扰的网络世界…

作者头像 李华